从excel spreedshet缺less列
我有一个发票清单,我把它们转移到一个Excel电子表格。
除了“作业date”列之外,所有列都被创build到电子表格中。 这在电子表格中是空白的。
代码如下:
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返回所有正确的信息,你可以看到工作date在那里:
但是当我创build后打开Excel文件时,作业date列是空的:
您应该将BaseSQL中的JobDate转换为string。
下面给出一个示例。 你可以使用它来得到一个想法如何将datetime转换为varchar。
DECLARE @myDateTime DATETIME SET @myDateTime = '2008-05-03' -- -- Convert string -- SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
我不知道你用什么框架将数据导出到excel中,但是我知道Excel并不直接支持date(意外!),至less在xml-based(OpenXml)xlsx文档中是这样。 它仅适用于string和数字(它们作为string和数字文字保存在底层文档中)
考虑到这一点,你可以使用简单的解决方法 :通过在sql中的cast / convert或C#中的ToString()将date转换为string。 显然,您将会失去Exceldatefunction(如datefilter,自定义格式)。
但是,这不是唯一的方式(欢呼!)。 您可以使用Excel存储数据的方式来保存数据。 如果你的框架不支持它,你将不得不自己做:配方将与用DocumentFormat.OpenXml.dll手动创buildxlsx文档相同。
实际上,Excel使用“OLE-自动化date”格式作为date的内部表示,它被实现为一个浮点数,其整数部分是1899年12月30日午夜之前或之后的天数,而其小数部分表示时间在那一天除以24.这个表示以数字文字forms存储在文档中。 Excel通过相应单元格的编号格式来区分date和数字。 考虑到这一点,您可以使用不是那么简单的解决方法 :
首先,将你的date转换为数字:
DateTime date = DateTime.Now; double dateValue = date.ToOADate(); //or TimeSpan time = DateTime.Now.TimeOfDay; double timeValue = (DateTime.FromOADate(0) + time).ToOADate();
然后将doublevariables设置为Excel单元格的CellValue,您可以在DataTable中创build具有double
数据types的新列,使用这个变换填充它,然后删除原始的DateTime列。
其次,将date格式应用于所需的单元格。 不幸的是,所需的代码在框架之间会有所不同,但是原则应该是一样的:
- find相应的单元格区域(CellRange或Cells,可能是Columns)
- 设置date格式string(通过类似于
range.NumberFormat.Format="dd/mm/yyyy"
或range.NumberFormatString="dd/mm/yyyy"
)
但是,如果这个框架不支持简化的格式(非常奇怪的框架),你必须为标准date格式设置range.NumberFormatId=22
或创build新的数字格式。 如果你相当不幸,这个框架就像DocumentFormat.OpenXml一样简单,你将不得不创build自定义的CellFormat,其中包含NumberFormatId(22或者自定义NumberFormat的id),将其添加到样式表中,并设置相应范围的styleIndex。
我不知道是否值得检查,但是在处理大型数据集和数据表时,我通常使用ClosedXML来完成。 只需传递一个数据表就容易了,让它为它创buildXLSX。 我有它运行我的Windows Server 2008 r2没有问题处理与多个表的大型请求,所以我知道它的工作真的很好。