Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EPPLUS如何知道工作表单元格的格式_Epplus_Epplus 4 - Fatal编程技术网

EPPLUS如何知道工作表单元格的格式

EPPLUS如何知道工作表单元格的格式,epplus,epplus-4,Epplus,Epplus 4,我正在使用EPPlus读取excel工作表,并将数据加载到datatable中以执行进一步的操作,然后将修改后的数据保存回excel文件 下面的代码检查单元格值是否为浮点值,然后将浮点值转换为datetime 当单元格值为日期(例如:Invoice date=42009)时,代码可以正常工作,但它会将非日期值(例如:amount=10)转换为日期 EPPlus库中是否有任何方法可以确定单元格的格式(即常规/日期/编号等) 简而言之,如果Excel中的数据格式为“正确的”日期字段(其格式设置为“日

我正在使用EPPlus读取excel工作表,并将数据加载到datatable中以执行进一步的操作,然后将修改后的数据保存回excel文件

下面的代码检查单元格值是否为浮点值,然后将浮点值转换为datetime

当单元格值为日期(例如:Invoice date=42009)时,代码可以正常工作,但它会将非日期值(例如:amount=10)转换为日期

EPPlus库中是否有任何方法可以确定单元格的格式(即常规/日期/编号等)


简而言之,如果Excel中的数据格式为“正确的”日期字段(其格式设置为“日期”,并且单元格角没有三角形),EPPlus将确定该格式并自动将其转换为单元格存储中的日期

Excel将此信息存储在XLSX xml文件中,例如sheet1.xml和styles.xml,您可以通过将文件扩展名更改为.ZIP并将其作为压缩文件夹打开来查看这些文件。因此,EPPlus将读取XML标志,并将字段值自动转换为DateTime。如果您想查看它的详细信息,请下载EPPlus源代码,并查看ExcelWorksheet类中的函数
private void SetValueFromXml(XmlTextReader xr,string type,int styleID,int row,int col)

我创建了一张工作表,添加了一个日期值,并将该值复制粘贴到单元格B2,但随后将格式设置为数字。然后我将B2复制到B3,但在B3中的值前面加上一个“使其成为字符串”。像这样:

当我运行这个单元测试时,一切都通过了:

[TestMethod]
public void Date_Number_Test()
{
    //http://stackoverflow.com/questions/28591763/epplus-how-to-know-the-format-of-the-worksheet-cell
    var existingFile = new FileInfo(@"c:\temp\datetest.xlsx");

    using (var package2 = new ExcelPackage(existingFile))
    {
        var ws = package2.Workbook.Worksheets["Sheet1"];

        var cell = ws.Cells["B1"];
        Assert.IsTrue(cell.Value is DateTime);

        cell = ws.Cells["B2"];
        Assert.IsTrue(cell.Value is double);

        cell = ws.Cells["B3"];
        Assert.IsTrue(cell.Value is string);
    }
}

但是,如果您处理的表格格式超出了您的控制范围,那么我认为您的方法是正确的,因为您必须确定数字的“意图”是什么,而不是能够依靠EPPlus(真正的excel)将其报告为。

如果您想知道当前的单元格格式,你为什么不使用ExcelNumberFormat

var style=oSheet.Cells[i, j].style;
string format=style.Numberformat.Format;
这将为您提供当前单元格格式,即“YYYY-MM-ddddd”、“%#.#等

var style=oSheet.Cells[i, j].style;
string format=style.Numberformat.Format;