【问题标题】:Column missing from excel spreedshetexcel电子表格中缺少列
【发布时间】:2016-08-28 05:45:12
【问题描述】:

我有一份发票清单,我将它们转移到 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 返回所有正确的信息,你可以看到工作日期在那里:

但是当我在创建 Excel 文件后打开它时,工作日期列是空白的:

【问题讨论】:

  • 请澄清一些事情。当我看到您的代码a)创建Excel工作表和b)将Excel文件作为下载提供时,您说“下载到excel”和“将链接列下载到excel”和“下载到电子表格”。您无法正确创建电子表格,对吧?
  • @Alexander 也许创造或转换会是一个更好的词?是的,问题在于创建excel。除了工作日期列之外,Excel 可以很好地创建问题中图像中的所有列。
  • 在将结果写入电子表格之前,您是否尝试在查询中将“工作日期”字段转换为字符串类型(varcharnvarchar 等)?
  • 您是否使用 GridView 来显示表格?
  • @AllanT 是的,它是一个 GridView

标签: c# excel worksheet-function


【解决方案1】:

您应该将 BaseSQL 中的 JobDate 转换为字符串。

下面给出了一个示例。您可以使用它来了解如何将 datetime 转换为 varchar。

DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'

--
-- Convert string
--
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)

【讨论】:

  • 感谢您的帮助。我使用CAST(j.JobDate AS char) AS JobDate 转换它,它现在出现在excel 电子表格中
  • @user123456789 如果此答案对您有用,您应该将其标记为“已接受”以供将来的读者使用。谢谢。
【解决方案2】:

我不知道您使用什么框架将数据导出到 Excel 以及它有多强大,但我知道 Excel 不直接支持日期(惊喜!),至少在基于 xml 的 (OpenXml) 中不支持xlsx 文件。它仅适用于字符串和数字(​​作为字符串和数字文字保存在基础文档中)
考虑到这一点,您可以使用简单的解决方法:通过 sql 中的 cast/convert 或 C# 中的 ToString() 将日期转换为字符串。显然,您将失去 Excel 日期功能(如日期过滤器、自定义格式)。
然而,这不是唯一的方法(干杯!)。您可以以与 Excel 存储数据相同的方式保存数据。如果您的框架不支持它,您将不得不自己做:配方将与使用 DocumentFormat.OpenXml.dll 手动创建 xlsx 文档相同。
实际上,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();

然后应该将double变量设置为Excel Cell的CellValue,您可以在DataTable中创建具有double数据类型的新列,使用此转换填充它,然后删除原始DateTime列。
其次,将日期格式应用于所需的单元格。不幸的是,框架之间所需的代码会有所不同,但原则应该是相同的:

  1. 找到对应的单元格范围(CellRange 或 Cells,可能是 Columns)
  2. 设置日期格式字符串(通过类似range.NumberFormat.Format="dd/mm/yyyy"range.NumberFormatString="dd/mm/yyyy"

但是,如果此框架不支持简化格式(这将是非常奇怪的框架),则您必须将 range.NumberFormatId=22 设置为标准日期格式或创建新的数字格式。如果你运气不好,而这个框架就像 DocumentFormat.OpenXml 一样简单,你将不得不创建具有相应 NumberFormatId(22 或自定义 NumberFormat 的 id)的自定义 CellFormat,将其添加到样式表并设置相应范围的 styleIndex。

【讨论】:

    【解决方案3】:

    我不知道它是否值得一试,但过去在处理大型数据集和数据表时,我通常使用 ClosedXML 来完成它。传递一个数据表并让它处理为它创建 XLSX 很容易。我让它在我的 Windows Server 2008 r2 上运行,在处理多张工作表的大型请求时没有问题,所以我知道它工作得非常好。

    https://closedxml.codeplex.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多