c#打开xml将现有单元格重新格式化为数字

火车

我有一个现有的电子表格。我想将某些单元格从general重新格式化customNumber. 但是出于某种原因,当我重新格式化它们以编号时,单元格值会更改为某个随机数。

这是我的代码的样子

           using (var d = SpreadsheetDocument.Open(_docPath, true))
            {
                var workSheet = GetWorksheetPart(d.WorkbookPart.Workbook.WorkbookPart, "Project Summary");

                foreach (var cellRef in _ProjectRequirementsFormService.NumberCellReferences)
                {
                    Cell theCell = workSheet.Worksheet.Descendants<Cell>().Where(c => c.CellReference == cellRef).FirstOrDefault();
                    if (theCell != null) {
                        //For some reason This line of code replaces the cell value with a value 5197
                        //and every iteration of the loop increments the value of the next cell found 5198, 5199, etc....
                        theCell.DataType = CellValues.Number;
                    }
                }
...
}

    public WorksheetPart GetWorksheetPart(WorkbookPart workbookPart, string sheetName)
    {
        string relId = workbookPart.Workbook.Descendants<Sheet>().First(s => sheetName.Equals(s.Name)).Id;
        return (WorksheetPart)workbookPart.GetPartById(relId);
    }

现在出于某种原因,这行代码theCell.DataType = CellValues.Number;用值 5197 替换单元格值,并且循环的每次迭代都会增加找到的下一个单元格的值 5198、5199 等......

当我评论那条有缺陷的行时,我在单元格中得到了正确的值,但格式不是 Number

在此处输入图片说明

这是我添加代码行以将其更改为数字格式时的样子。为什么它会更改所有单元格值以及如何修复它?

在此处输入图片说明

链接到示例文件

https://drive.google.com/file/d/0B7UImeY4gR3VdnBBZmdWSHJqN2lhRmFqY1N6THJXNmIzZDhF/view?usp=sharing

Access Denied

Decompile your xlsx to C# using Microsoft Open XML SDK Tools.

https://www.microsoft.com/en-us/download/details.aspx?id=30425

You'll see that your cells have SharedString data type. It's a kind of id, cell stores id, while values are stored in sharedstring table. These weird numbers you see after changing datetype are these ids in sharedstring table. Changing DataType does not really change the way values are stored, it changes how they are interpreted. They still will be "Number stored as string" if you change its type to numeric. For example let's take a look at cell "E17":

Cell cell261 = new Cell(){ CellReference = "E17", StyleIndex = (UInt32Value)11U, DataType = CellValues.SharedString };
CellValue cellValue90 = new CellValue();
cellValue90.Text = "26";

... Should be 50000 isn't it?

        SharedStringItem sharedStringItem27 = new SharedStringItem();
        Text text45 = new Text();
        text45.Text = "50000";
        sharedStringItem27.Append(text45);

为了从电子表格中读取正确的值,您需要使用 ms docs 示例中的 GetCellValue 代码。

https://docs.microsoft.com/en-us/office/open-xml/how-to-retrieve-the-values-of-cells-in-a-spreadsheet

然后您可以编写以下代码来读取真实的单元格值(我对其进行了一些更改并传递了文档而不是文件路径)解析它并保存为十进制类型:

var value = GetCellValue(d, "Sheet1", cellRef.CellReference);

if (!string.IsNullOrEmpty(value))
{
  if (decimal.TryParse(value, out decimal val))
   {
      cellRef.CellValue = new 
      CellValue(DocumentFormat.OpenXml.DecimalValue.FromDecimal(val));
      cellRef.StyleIndex = 0U;                            
   }
 }

StyleIndex 0U 似乎是通用格式,但由于您拥有正确的单元格类型,因此无关紧要。即使我仍然不明白为什么在打开固定的 xlsx 时不计算 =sum 公式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Apache POI中的单元格值格式化为数字的会计或货币

来自分类Dev

如何将选定的单元格(列)格式化为 9 位数字

来自分类Dev

knitr kable将单元格文本格式化为有序列表

来自分类Dev

如何将AngularJS ui-grid单元格中的数字值格式化为两位小数?

来自分类Dev

自动将条目格式化为电子邮件超链接的单元格

来自分类Dev

Telerik RadGridView.ExportToXlsx - 将单元格格式化为数字

来自分类Dev

将单元格格式化为双倍

来自分类Dev

SQL:导出到 XML 将数字数据重新格式化为科学记数法

来自分类Dev

从Excel读取列,重新格式化单元格

来自分类Dev

Excel 格式化单元格中的数字

来自分类Dev

格式化包含公式或硬数字的单元格

来自分类Dev

Python-使用win32com.client将Excell单元格范围格式化为表格

来自分类Dev

Python-使用win32com.client将Excell单元格范围格式化为表格

来自分类Dev

openxlsx将单元格格式化为带逗号的数字,并将0值替换为破折号

来自分类Dev

将XML从标签重新格式化为属性和名称

来自分类Dev

将数字格式化为带有 SI 前缀的整数

来自分类Dev

C# EPPlus OpenOfficeXml 格式化单元格

来自分类Dev

在单元格中将日期格式化为yyyy-mm-dd

来自分类Dev

如何在PHPExcel中将单元格值格式化为日期?

来自分类Dev

在单元格中将日期格式化为yyyy-mm-dd

来自分类Dev

重击:从格式化为表格的输出中提取单元格

来自分类Dev

如何在不使用条件格式的情况下使用VBA将符号/图标格式化为单元格

来自分类Dev

使用Apache POI将Excel单元格格式化为Dollar,而机器货币不是Dollar

来自分类Dev

Apps脚本如何将单元格格式化为适当的文本(大写)

来自分类Dev

将单元格格式化为百分比并限制输入

来自分类Dev

如何使用Apache POI将单元格格式化为货币

来自分类Dev

WPF DataGrid 将单元格格式化为千位分隔符

来自分类Dev

如果单元格包含“下一小时”(当前小时+ 1)的值,如何有条件地将其格式化为某种颜色?

来自分类Dev

VBA:将访问权限导出到 Excel -> 选择所有单元格 -> 格式化表格

Related 相关文章

  1. 1

    将Apache POI中的单元格值格式化为数字的会计或货币

  2. 2

    如何将选定的单元格(列)格式化为 9 位数字

  3. 3

    knitr kable将单元格文本格式化为有序列表

  4. 4

    如何将AngularJS ui-grid单元格中的数字值格式化为两位小数?

  5. 5

    自动将条目格式化为电子邮件超链接的单元格

  6. 6

    Telerik RadGridView.ExportToXlsx - 将单元格格式化为数字

  7. 7

    将单元格格式化为双倍

  8. 8

    SQL:导出到 XML 将数字数据重新格式化为科学记数法

  9. 9

    从Excel读取列,重新格式化单元格

  10. 10

    Excel 格式化单元格中的数字

  11. 11

    格式化包含公式或硬数字的单元格

  12. 12

    Python-使用win32com.client将Excell单元格范围格式化为表格

  13. 13

    Python-使用win32com.client将Excell单元格范围格式化为表格

  14. 14

    openxlsx将单元格格式化为带逗号的数字,并将0值替换为破折号

  15. 15

    将XML从标签重新格式化为属性和名称

  16. 16

    将数字格式化为带有 SI 前缀的整数

  17. 17

    C# EPPlus OpenOfficeXml 格式化单元格

  18. 18

    在单元格中将日期格式化为yyyy-mm-dd

  19. 19

    如何在PHPExcel中将单元格值格式化为日期?

  20. 20

    在单元格中将日期格式化为yyyy-mm-dd

  21. 21

    重击:从格式化为表格的输出中提取单元格

  22. 22

    如何在不使用条件格式的情况下使用VBA将符号/图标格式化为单元格

  23. 23

    使用Apache POI将Excel单元格格式化为Dollar,而机器货币不是Dollar

  24. 24

    Apps脚本如何将单元格格式化为适当的文本(大写)

  25. 25

    将单元格格式化为百分比并限制输入

  26. 26

    如何使用Apache POI将单元格格式化为货币

  27. 27

    WPF DataGrid 将单元格格式化为千位分隔符

  28. 28

    如果单元格包含“下一小时”(当前小时+ 1)的值,如何有条件地将其格式化为某种颜色?

  29. 29

    VBA:将访问权限导出到 Excel -> 选择所有单元格 -> 格式化表格

热门标签

归档