我正在使用Office Open XML SDK读取.xlsx文件,并对阅读日期/时间值感到困惑.我的一个电子表格有此标记(由Excel 2010生成)
<x:row r="2" spans="1:22" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:c r="A2" t="s">
<x:v>56</x:v>
</x:c>
<x:c r="B2" t="s">
<x:v>64</x:v>
</x:c>
.
.
.
<x:c r="J2" s="9">
<x:v>17145</x:v>
</x:c>
Run Code Online (Sandbox Code Playgroud)
单元格J2具有日期序列值和样式属性s="9".但是,Office Open XML规范称9对应于后面的超链接.这是ECMA-376第4版第499页第1部分 - 基础和标记语言参考 .pdf的屏幕截图.

规范中包含的presetCellStyles.xml文件也将builtinId9称为后续超链接.
<followedHyperlink builtinId="9">
Run Code Online (Sandbox Code Playgroud)
规范中的所有样式都只是可视化格式样式,而不是数字样式.定义的数字样式在哪里?如何区分样式引用s="9"与指示单元格格式(可视)样式与数字样式?
显然,我正在寻找错误的地方,以匹配单元格上的样式与其数字格式.哪里是找到这些信息的合适地点?
我使用以下代码将日期时间添加到电子表格中的列:
var dt = DateTime.Now;
r.AppendChild<Cell>(new Cell()
{
CellValue = new CellValue(dt.ToOADate().ToString()),
DataType = new EnumValue<CellValues>(CellValues.Date),
StyleIndex = 1,
CellReference = header[6] + index
});
Run Code Online (Sandbox Code Playgroud)
当我尝试在Excel 2010中打开该文件时,我收到错误
var dt = DateTime.Now;
r.AppendChild<Cell>(new Cell()
{
CellValue = new CellValue(dt.ToOADate().ToString()),
DataType = new EnumValue<CellValues>(CellValues.Date),
StyleIndex = 1,
CellReference = header[6] + index
});
Run Code Online (Sandbox Code Playgroud)
如果我注释掉这一行,一切都很好.
我在StackOverFlow上提到了simiiar问题,但它们基本上和我一样有相同的代码
我找不到这个.
我的情况:
我的问题:
我想构建的excel文件中的某些数据以DateTime格式存在.因为我不想只使用字符串(弦乐日期时间无法正确排序)我想将包含DateTime的单元格设置为我选择的格式,就像我在excel中所做的那样.
根据我的理解,我必须使用样式表来达到这一点.我已经浏览网页一段时间了,找到一个对这个问题有简单解释的人,但似乎很难找到.
我已经在mem中有一个电子表格,可以通过SheetData添加数据.我唯一缺少的是细胞的格式化/样式化.
这是我得到了多远:
DocumentFormat.OpenXml.Packaging.SpreadsheetDocument doc = SpreadsheetDocument.Create("test.xlsx", SpreadsheetDocumentType.Workbook);
WorkbookPart wbPart = doc.AddWorkbookPart();
wbPart.Workbook = new Workbook();
SheetData data = new SheetData(
new Row(...etc));
WorksheetPart wsPart = wbPart.AddNewPart<WorksheetPart>();
wsPart.Worksheet = new Worksheet(data);
Sheets sheets = doc.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
Sheet sheet = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(wsPart), SheetId = 1, Name = "TestSheet" };
sheets.Append(sheet);
wbPart.Workbook.Save();
doc.Close();
Run Code Online (Sandbox Code Playgroud)
在哪里以及如何在日期时间(例如"dd-MM-yyyy")等样式中添加简单的附加内容,以及稍后可能更高级的样式?
我希望我足够具体:)同时我会继续寻找......
谢谢 !!!
这就是我在做的事情:
CellFormat cellFormat =
new CellFormat()
{ NumberFormatId = (UInt32Value)14U,
FontId = (UInt32Value)0U,
FillId = (UInt32Value)0U,
BorderId = (UInt32Value)0U,
FormatId = (UInt32Value)0U,
ApplyNumberFormat = true };
sd.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.AppendChild<CellFormat>(cellFormat);
_dateStyleIndex = sd.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Count() - 1;
Run Code Online (Sandbox Code Playgroud)
然后在我的代码后面的某个地方
else if (type == DataTypes.DateTime)
{
DateTime dateTime = DateTime.Parse(text);
double oaValue = dateTime.ToOADate();
cell.CellValue = new CellValue(oaValue.ToString(CultureInfo.InvariantCulture));
cell.DataType = new EnumValue<CellValues>(CellValues.Date);
cell.StyleIndex = Convert.ToUInt32(_dateStyleIndex);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用Open XML SDK Tool验证生成的excel文件时,我收到以下验证错误:属性't'具有无效值'd'.枚举约束失败.
我在这里错过了什么?提前谢谢你的帮助.
PS:添加,这就是x:sheetData的样子.它给了我验证错误:
<x:sheetData xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:row r="2">
<x:c r="B2" t="s">
<x:v>0</x:v>
</x:c>
<x:c r="C2" t="s">
<x:v>1</x:v>
</x:c> …Run Code Online (Sandbox Code Playgroud) 我使用 OpenXML 将 Datagridview 导出到 Excel。如果我使用 CellValues.String 导出单元格,则一切工作正常,Excel 文件中不会出现任何错误,但我需要的是将所有日期和数字数据正确转换为相应的单元格格式。我尝试使用内置格式(不是自定义格式)来更改单元格格式,但后来我的 Excel 损坏了。
这是我到目前为止所尝试的:
public void Export_to_Excel(DataGridView dgv, string path)
{
using (var workbook = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook))
{
var workbookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new Workbook();
workbook.WorkbookPart.Workbook.Sheets = new Sheets();
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
sheetPart.Worksheet = new Worksheet(sheetData);
Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0)
{
sheetId =
sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
Sheet sheet = new …Run Code Online (Sandbox Code Playgroud)