【问题标题】:NPOI Date Format CellNPOI 日期格式单元格
【发布时间】:2014-02-11 23:32:28
【问题描述】:

我正在使用 NPOI 在 Sheet1 中创建固定的工作表模板,并且需要来自 Sheet2 的日期格式的数据。我从数据库生成 DataTable 以在 Sheet2 中设置数据。 这是我的代码:

private DataTable getWeek()
{    
  strConn = WebConfigurationManager.ConnectionStrings["myConn"].ConnectionString;
  conn = new OdbcConnection(strConn);
  conn.Open();
  sql = "SELECT week, sunday, saturday FROM tb_weekreferences";     
  da = new OdbcDataAdapter(sql, conn);
  dt = new DataTable();
  da.Fill(dt);
  conn.Close();        

  return dt;

}

然后将DataTable导出到Excel:

private int ExportDataTableToExcel(DataTable sourceTable, ISheet sheet)
    {
        IRow headerRow = sheet.CreateRow(0);
        ICell headerCell;
        ICell cell = null;
        Dictionary<String, ICellStyle> styles = CreateExcelStyles(hssfwb);

        //handling value
        int rowIdx = 1;
        foreach (DataRow row in sourceTable.Rows)
        {
            IRow dataRow = sheet.CreateRow(rowIdx);            
            foreach (DataColumn column in sourceTable.Columns)
            {
                cell = dataRow.CreateCell(column.Ordinal);                
                cell.SetCellValue(row[column].ToString());
                cell.CellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("");
                cell.CellStyle = styles["cell"]; 
            }            
            rowIdx++;
        }

        //handling header
        foreach (DataColumn column in sourceTable.Columns)
        {
            headerCell = headerRow.CreateCell(column.Ordinal);
            headerCell.SetCellValue(column.ColumnName);
            headerCell.CellStyle = styles["header"];
            sheet.AutoSizeColumn(column.Ordinal);
            sheet.SetColumnWidth(column.Ordinal, (sheet.GetColumnWidth(column.Ordinal) + (5 * 256))); // set width = autofit() + (5 * 256)
        }
        return rowIdx;
    }

在 Sheet1 中,我使用 vlookup 公式从 Sheet2 中获取“星期日”和“星期六”。但它不起作用,因为 Sheet2 中的星期、星期日和星期六的值看起来像字符串(左对齐单元格)。生成数据到excel时如何设置日期单元格格式? 请给我解决方案。

谢谢。

【问题讨论】:

    标签: c# date format cell npoi


    【解决方案1】:

    第一个问题是这一行

    cell.SetCellValue(row[column].ToString());
    

    您正在将值转换为字符串,但您可能将其转换为 DateTime 格式,因此 NPOI 知道这是日期时间。

    如果可行,请尝试:

    cell.SetCellValue(DateTime.Now);
    

    其次,尝试先设置单元格的样式,然后更改它的 DataFormat 属性,但自定义格式如下:

    IDataFormat dataFormatCustom = workbook.CreateDataFormat();
    cell.CellStyle = styles["cell"]; 
    cell.CellStyle.DataFormat = dataFormatCustom.GetFormat("yyyyMMdd HH:mm:ss");
    

    这会将您的 DateTime 值格式化为人类可读的格式。

    【讨论】:

    • 在您的第一个代码中现在将获取日期,但我需要从其他表格中获取日期。
    • 我已经尝试了你的第二个代码,它不起作用,通过 vlookup 公式格式化单元格仍然像 sheet2(作为字符串)。
    • 看来您在 Sheet2 中有问题。当您从数据库填充 Sheet2 时(在进行查找之前),您是否能够将该日期转换为 DataTime 格式?你在数据库中有什么格式?也许在您使用 getWeek() 方法读取的 DataTable 中,您可以创建一些临时列,其中包含 DateTime 格式的日期而不是字符串并将其用于查找?
    • 我使用 SQL Server 2008,字段“星期日”和“星期六”是日期。在 sql 查询中我转换为:convert(varchar(9), sunday, 6) as Sunday -> 31 Dec 12。当从数据表导出到 excel 时,我检查列的类型:if(type == "System.DateTime") { cell.CellValue(Convert.ToDateTime(row[column]));如果类型是 Int 或 String 它的工作,但在日期我得到这个错误: Object cannot be cast from DBNull to other types.
    • 你有更好的主意吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2011-11-18
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2013-08-10
    相关资源
    最近更新 更多