C# 使用Epplus格式化特定列不保存

C# 使用Epplus格式化特定列不保存,c#,excel,epplus,C#,Excel,Epplus,我正在使用EPPlus并遍历工作簿中每个工作表的所有列。我试图用一个标题来格式化每一列,标题中包含一个数字格式的单词“NUMBER”。它运行并到达断点,在断点处我设置了数字格式,但当我打开电子表格时,列仍然是文本格式。任何帮助都将不胜感激 private void cleanSpreadSheet(string fileName) { // set all columns with a header of number to numeric type

我正在使用EPPlus并遍历工作簿中每个工作表的所有列。我试图用一个标题来格式化每一列,标题中包含一个数字格式的单词“NUMBER”。它运行并到达断点,在断点处我设置了数字格式,但当我打开电子表格时,列仍然是文本格式。任何帮助都将不胜感激

    private void cleanSpreadSheet(string fileName)
    {
        // set all columns with a header of number to numeric type
        FileInfo existingFile = new FileInfo(fileName);
        var package = new ExcelPackage(existingFile);

        ExcelWorkbook wb = package.Workbook;

        foreach (ExcelWorksheet workSheet in wb.Worksheets)
        {
            var start = workSheet.Dimension.Start;
            var end = workSheet.Dimension.End;
            for (int col = start.Column; col <= end.Column; col++)
            { // col by col
                if (workSheet.Cells[1, col].Text.ToUpper().Contains("NUMBER"))
                {
                    workSheet.Column(col).Style.Numberformat.Format = "0";                         
                }

            }
        }
        package.Save();
        package.Dispose();
        wb.Dispose();
    }
private void cleansheet(字符串文件名)
{
//将标题为数字的所有列设置为数字类型
FileInfo existingFile=新的FileInfo(文件名);
var package=新的ExcelPackage(现有文件);
ExcelWorkbook wb=package.Workbook;
foreach(工作表中的Excel工作表)
{
var start=workSheet.Dimension.start;
var end=工作表.Dimension.end;

对于(int col=start.Column;col而言,问题可能是现有Excel工作簿中的数据格式为Excel“文本”。如果是这种情况,您可能无法简单地将每个单元格的格式转换为数字,因为Excel不知道如何将“文本”转换为“数字”

相反,您可能需要迭代EPPlus中的每一列和每一行,并在强制转换后替换每一个值。下面的代码可能会对强制转换进行一些错误检查,但会让您了解这个概念

//foreach行…foreach列。。。
ExcelRange单元格=工作表。单元格[行,列];

cell.Value=double.Parse((string)cell.Value);

问题可能是现有Excel工作簿的数据格式为Excel“文本”。如果是这种情况,您可能无法简单地将每个单元格的格式转换为数字,因为Excel不知道如何将“文本”转换为“数字”

相反,您可能需要迭代EPPlus中的每一列和每一行,并在强制转换后替换每一个值。下面的代码可能会对强制转换进行一些错误检查,但会让您了解这个概念

//foreach行…foreach列。。。
ExcelRange单元格=工作表。单元格[行,列];

cell.Value=double.Parse((字符串)cell.Value);

如果必须对对象调用Dispose,这是一种代码味道。更可能的情况是,您应该使用。我相信您要做的是设置列的数据类型,而不是设置格式。我相信EPPlus会根据您将行的值设置为等于的对象的类型来确定。请参阅示例。要扩展@mason的内容,请参阅也就是说,如果现有工作簿单元格内容是“Text”,则可能需要执行int.Parse/double.Parse并将单元格内容替换为“number”@sfm-这意味着我必须遍历行并更改列中的每个单元格,对吗?@Missy-这就是我的想法,但我还没有测试它以确定这是否是问题所在。您可能还应该使用double.TryParse或对每行的每个类型转换使用try/catch。如果必须对对象调用Dispose,则这是一种代码味道。更可能的情况是,您应该使用。我相信您要做的是设置列的数据类型,而不是设置格式。我相信EPPlus会根据您将行的值设置为等于的对象的类型来确定。请参阅示例。若要扩展@mason所说的内容,请确定现有工作簿单元格内容是否为“文本”,您可能需要执行int.Parse/double.Parse并将单元格内容替换为“number”@sfm-这意味着我必须遍历行并更改列中的每个单元格,对吗?@Missy-这就是我的想法,但我还没有测试它以确定这是否是问题所在。您可能还应该使用double.TryParse或对每行的每个类型转换使用try/catch。