【问题标题】:Formating Specific Columns Using Epplus Not Saving使用 Epplus 格式化特定列不保存
【发布时间】:2017-07-13 09:27:42
【问题描述】:

我正在使用 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();
    }

【问题讨论】:

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

标签: c# excel epplus


【解决方案1】:

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

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

//foreach row ... foreach column... ExcelRange cell = worksheet.Cells[row, col]; cell.Value = double.Parse((string)cell.Value);

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多