excel 电子表格中缺少列
Column missing from excel spreedshet
我有一张发票清单,我将它们转移到 Excel 电子表格中。
除“工作日期”列外,所有列都已创建到电子表格中。那是电子表格中的空白。
代码如下:
string Directory = ConfigurationSettings.AppSettings["DownloadDestination"] + Company.Current.CompCode + "\";
string FileName = DataUtils.CreateDefaultExcelFile(Company.Current.CompanyID, txtInvoiceID.Value, Directory);
FileInfo file = new FileInfo(FileName);
Response.Clear();
Response.ContentType = "application/x-download";
Response.AddHeader("Content-Length", file.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.CacheControl = "public";
Response.TransmitFile(file.FullName);
Response.Flush();
Context.ApplicationInstance.CompleteRequest();
public static string CreateDefaultExcelFile(int CompanyID, string InvoiceNo, string CreateDirectory)
{
List<MySqlParameter> param = new List<MySqlParameter>{
{ new MySqlParameter("CompanyID", CompanyID) },
{ new MySqlParameter("InvoiceNo", InvoiceNo) }
};
DataTable result = BaseDisplaySet.CustomFill(BaseSQL, param);
string FileName = CreateDirectory + "InvoiceFile_" + DateTime.Now.ToString("yyyyMMddhhmmssff") + ".";
FileName += "xlsx";
XLWorkbook workbook = new XLWorkbook();
workbook.Worksheets.Add(result, "Bulk Invoices");
workbook.SaveAs(FileName);
return FileName;
}
private const string BaseSQL = " SELECT q.InvoiceNo AS InvoiceNumber, j.JobNo, j.JobDate AS JobDate, " +
" (SELECT Name FROM job_address WHERE AddressType = 6 AND JobID = j.ID LIMIT 0,1) AS DebtorName, " +
" (SELECT CONCAT(Name,CONCAT(',',Town)) FROM job_address WHERE AddressType = 3 AND JobID = j.ID LIMIT 0,1) AS CollectFrom, " +
" (SELECT CONCAT(Name,CONCAT(',',Town)) FROM job_address WHERE AddressType = 2 AND JobID = j.ID LIMIT 0,1) AS DeliverTo, " +
" deladd.Town AS DeliverToTown, deladd.County AS DeliveryToCounty, " +
" (SELECT DocketNo FROM job_dockets WHERE JobID = j.ID LIMIT 0,1) AS DocketNo, " +
" SUM(j.DelAmt) AS DelAmount, " +
" (SELECT CAST(group_concat(DISTINCT CONCAT(AdvisedQty,' ',PieceType) separator ',') AS CHAR(200)) FROM job_pieces WHERE JobID = j.ID GROUP BY JobID ) AS PieceBreakDown " +
" FROM Invoice q " +
" LEFT JOIN customer c ON q.accountcode = c.ID " +
" INNER JOIN job_new j ON q.JobID = j.ID " +
" LEFT JOIN job_address coladd ON coladd.JobID = j.ID AND coladd.AddressType = 3 " +
" LEFT JOIN job_address deladd ON deladd.JobID = j.ID AND deladd.AddressType = 2 " +
" WHERE q.IsActive = 1 AND q.Company_ID = ?CompanyID AND q.InvoiceNo = ?InvoiceNo " +
" group by j.id";
sql returns 所有正确的信息,如您所见,工作日期在那里:
但是当我打开创建后的 Excel 文件时,工作日期栏是空白的:
您应该将 BaseSQL 中的 JobDate 转换为字符串。
下面给出了一个示例。您可以使用它来了解如何将 datetime 转换为 varchar。
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'
--
-- Convert string
--
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
我不知道它是否值得一试,但在过去处理大型数据集和数据表时,我通常使用 ClosedXML 来完成它。只需传递一个数据表并让它处理为其创建 XLSX 就很容易了。我有 运行 我的 Windows Server 2008 r2 在处理多张纸的大型请求时没有问题,所以我知道它工作得很好。
我不知道你用什么框架导出数据到 excel 以及它有多强大,但我知道 Excel 不直接支持日期(惊喜!),至少不在基于 xml 的 (OpenXml) xlsx 文档中。它仅适用于字符串和数字(作为字符串和数字文字保存在基础文档中)
考虑到这一点,您可以使用 简单的解决方法 :通过 sql 中的 cast/convert 或 C# 中的 ToString() 将日期转换为字符串。显然,您将失去 Excel 日期功能(如日期过滤器、自定义格式)。
但是,这不是唯一的方法(干杯!)。您可以用 Excel 存储数据的相同方式保存数据。如果你的框架不支持它,你将不得不自己做:配方将与手动创建 xlsx 文档相同 DocumentFormat.OpenXml.dll.
实际上,Excel 使用 "OLE-Automation Date" 格式作为日期的内部表示,它被实现为一个浮点数,其整数部分是 1899 年 12 月 30 日午夜前后的天数,其小数部分表示当天的时间除以 24。此表示作为数字字面值存储在文档中。 Excel 通过对应单元格的编号格式区分日期和数字。考虑到这一点,您可以使用 不太简单的解决方法:
首先,将您的日期转换为数字:
DateTime date = DateTime.Now;
double dateValue = date.ToOADate();
//or
TimeSpan time = DateTime.Now.TimeOfDay;
double timeValue = (DateTime.FromOADate(0) + time).ToOADate();
然后双变量应设置为 Excel 单元格的 CellValue,您可以在 DataTable 中创建具有 double
数据类型的新列,使用此转换填充它,然后删除原始 DateTime 列。
其次,将日期格式应用于所需的单元格。不幸的是,所需的代码会因框架而异,但原则应该是相同的:
- 找到相应的单元格范围(CellRange 或 Cells,可能是 Columns)
- 设置日期格式字符串(通过
range.NumberFormat.Format="dd/mm/yyyy"
或 range.NumberFormatString="dd/mm/yyyy"
之类的东西)
但是,如果此框架不支持简化格式(非常奇怪的框架),您将不得不为标准日期格式设置 range.NumberFormatId=22
或创建新的数字格式。如果你运气不好,这个框架简单到DocumentFormat.OpenXml,你将不得不使用相应的NumberFormatId(22或自定义NumberFormat的id)创建自定义CellFormat,将其添加到样式表并设置相应范围的styleIndex。
我有一张发票清单,我将它们转移到 Excel 电子表格中。
除“工作日期”列外,所有列都已创建到电子表格中。那是电子表格中的空白。
代码如下:
string Directory = ConfigurationSettings.AppSettings["DownloadDestination"] + Company.Current.CompCode + "\";
string FileName = DataUtils.CreateDefaultExcelFile(Company.Current.CompanyID, txtInvoiceID.Value, Directory);
FileInfo file = new FileInfo(FileName);
Response.Clear();
Response.ContentType = "application/x-download";
Response.AddHeader("Content-Length", file.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.CacheControl = "public";
Response.TransmitFile(file.FullName);
Response.Flush();
Context.ApplicationInstance.CompleteRequest();
public static string CreateDefaultExcelFile(int CompanyID, string InvoiceNo, string CreateDirectory)
{
List<MySqlParameter> param = new List<MySqlParameter>{
{ new MySqlParameter("CompanyID", CompanyID) },
{ new MySqlParameter("InvoiceNo", InvoiceNo) }
};
DataTable result = BaseDisplaySet.CustomFill(BaseSQL, param);
string FileName = CreateDirectory + "InvoiceFile_" + DateTime.Now.ToString("yyyyMMddhhmmssff") + ".";
FileName += "xlsx";
XLWorkbook workbook = new XLWorkbook();
workbook.Worksheets.Add(result, "Bulk Invoices");
workbook.SaveAs(FileName);
return FileName;
}
private const string BaseSQL = " SELECT q.InvoiceNo AS InvoiceNumber, j.JobNo, j.JobDate AS JobDate, " +
" (SELECT Name FROM job_address WHERE AddressType = 6 AND JobID = j.ID LIMIT 0,1) AS DebtorName, " +
" (SELECT CONCAT(Name,CONCAT(',',Town)) FROM job_address WHERE AddressType = 3 AND JobID = j.ID LIMIT 0,1) AS CollectFrom, " +
" (SELECT CONCAT(Name,CONCAT(',',Town)) FROM job_address WHERE AddressType = 2 AND JobID = j.ID LIMIT 0,1) AS DeliverTo, " +
" deladd.Town AS DeliverToTown, deladd.County AS DeliveryToCounty, " +
" (SELECT DocketNo FROM job_dockets WHERE JobID = j.ID LIMIT 0,1) AS DocketNo, " +
" SUM(j.DelAmt) AS DelAmount, " +
" (SELECT CAST(group_concat(DISTINCT CONCAT(AdvisedQty,' ',PieceType) separator ',') AS CHAR(200)) FROM job_pieces WHERE JobID = j.ID GROUP BY JobID ) AS PieceBreakDown " +
" FROM Invoice q " +
" LEFT JOIN customer c ON q.accountcode = c.ID " +
" INNER JOIN job_new j ON q.JobID = j.ID " +
" LEFT JOIN job_address coladd ON coladd.JobID = j.ID AND coladd.AddressType = 3 " +
" LEFT JOIN job_address deladd ON deladd.JobID = j.ID AND deladd.AddressType = 2 " +
" WHERE q.IsActive = 1 AND q.Company_ID = ?CompanyID AND q.InvoiceNo = ?InvoiceNo " +
" group by j.id";
sql returns 所有正确的信息,如您所见,工作日期在那里:
但是当我打开创建后的 Excel 文件时,工作日期栏是空白的:
您应该将 BaseSQL 中的 JobDate 转换为字符串。
下面给出了一个示例。您可以使用它来了解如何将 datetime 转换为 varchar。
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'
--
-- Convert string
--
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
我不知道它是否值得一试,但在过去处理大型数据集和数据表时,我通常使用 ClosedXML 来完成它。只需传递一个数据表并让它处理为其创建 XLSX 就很容易了。我有 运行 我的 Windows Server 2008 r2 在处理多张纸的大型请求时没有问题,所以我知道它工作得很好。
我不知道你用什么框架导出数据到 excel 以及它有多强大,但我知道 Excel 不直接支持日期(惊喜!),至少不在基于 xml 的 (OpenXml) xlsx 文档中。它仅适用于字符串和数字(作为字符串和数字文字保存在基础文档中)
考虑到这一点,您可以使用 简单的解决方法 :通过 sql 中的 cast/convert 或 C# 中的 ToString() 将日期转换为字符串。显然,您将失去 Excel 日期功能(如日期过滤器、自定义格式)。
但是,这不是唯一的方法(干杯!)。您可以用 Excel 存储数据的相同方式保存数据。如果你的框架不支持它,你将不得不自己做:配方将与手动创建 xlsx 文档相同 DocumentFormat.OpenXml.dll.
实际上,Excel 使用 "OLE-Automation Date" 格式作为日期的内部表示,它被实现为一个浮点数,其整数部分是 1899 年 12 月 30 日午夜前后的天数,其小数部分表示当天的时间除以 24。此表示作为数字字面值存储在文档中。 Excel 通过对应单元格的编号格式区分日期和数字。考虑到这一点,您可以使用 不太简单的解决方法:
首先,将您的日期转换为数字:
DateTime date = DateTime.Now;
double dateValue = date.ToOADate();
//or
TimeSpan time = DateTime.Now.TimeOfDay;
double timeValue = (DateTime.FromOADate(0) + time).ToOADate();
然后双变量应设置为 Excel 单元格的 CellValue,您可以在 DataTable 中创建具有 double
数据类型的新列,使用此转换填充它,然后删除原始 DateTime 列。
其次,将日期格式应用于所需的单元格。不幸的是,所需的代码会因框架而异,但原则应该是相同的:
- 找到相应的单元格范围(CellRange 或 Cells,可能是 Columns)
- 设置日期格式字符串(通过
range.NumberFormat.Format="dd/mm/yyyy"
或range.NumberFormatString="dd/mm/yyyy"
之类的东西)
但是,如果此框架不支持简化格式(非常奇怪的框架),您将不得不为标准日期格式设置 range.NumberFormatId=22
或创建新的数字格式。如果你运气不好,这个框架简单到DocumentFormat.OpenXml,你将不得不使用相应的NumberFormatId(22或自定义NumberFormat的id)创建自定义CellFormat,将其添加到样式表并设置相应范围的styleIndex。