将单元格的DataType更改为Double

时间:2014-06-17 05:22:16

标签: c# openxml

我正在使用OpenXML创建Microsoft Excel文件。我正在尝试使用

将双重类型变量(例如:4.987456789)插入到Excel中
Cell cell = new Cell()
{
    CellReference = "A2",
    DataType = CellValues.String,
    CellValue = new CellValue(Convert.ToString(value))
};

但是,当制作单元格时,它是文本形式,Excel表示“此单元格中的数字被格式化为文本或前面有撇号”。如何格式化单元格以插入双?

编辑: 对不起,这是双倍的?键入,我按照tutorial

4 个答案:

答案 0 :(得分:3)

使用CellValues.Number对我来说很好,例如:

double? value = 4.9874567891;
Cell cell2 = new Cell()
{
    CellReference = "A2",
    DataType = CellValues.Number,
    CellValue = new CellValue(Convert.ToString(value))
};

在没有警告的情况下将双倍值打印到excel。

答案 1 :(得分:1)

我遇到了同样的问题。我按照各种帖子和答案的建议,在单元格上应用了一种风格......没有成功。

最后我找到了问题的根源,所以解决方案:

在我的循环中,我以相同的方式插入所有数据,即使用InsertSharedStringItem()函数。

如果您在电子表格中插入一个数字,那么单元格格式将无用,您的号码将不会被视为数字。

你应该做的是“直接”插入它。


index =InsertSharedStringItem(myStringNumber, shareStringPart);
cell = InsertCellInWorksheet("A", 1, worksheetPart);
cell.CellValue = new CellValue(index.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
cell.StyleIndex = _doubleStyleId;

无效。


cell = InsertCellInWorksheet("A", 1, worksheetPart);
cell.CellValue = new CellValue(myStringNumber);
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.StyleIndex = _doubleStyleId;

没问题

与Claies写道:

Stylesheet styleSheet = workbook.WorkbookStylesPart.Stylesheet; 
_doubleStyleId = createCellFormat(styleSheet, null,null, UInt32Value.FromUInt32(4));

可以找到createCellFormat()的代码here

答案 2 :(得分:0)

OpenXML始终将单元格创建为内联文本,并依赖格式设置来确定Excel中的正确显示格式。 Excel中的每种数字格式都对应一个唯一的代码,并且样式可以应用于单元格,就像您可以在Excel中更改样式一样。

OpenXML Standard定义了一系列代码,无需创建自定义StyleSheet即可分配这些代码。

double的隐含格式为4 #,##0.00

所以首先要创建styleId:

Stylesheet styleSheet = workbook.WorkbookStylesPart.Stylesheet; 
_doubleStyleId = createCellFormat(styleSheet, null, null, UInt32Value.FromUInt32(4));

然后,在单元格上设置styleId:

cell.StyleIndex = _doubleStyleId;

答案 3 :(得分:0)

这次聚会晚了,但是我遇到了这个问题,对我来说,解决方案是默认使用本地语言进行字符串化,大概是使用','作为十进制分隔符

    foreach ($array as $line) 
            fputcsv($fh, array_map('insertquote', $line), $delimiter);
    
function insertquote($value) {
        return "\xEF\xBB\xBF".$value;
    }

为我解决了。