我正在使用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"与指示单元格格式(可视)样式与数字样式?
显然,我正在寻找错误的地方,以匹配单元格上的样式与其数字格式.哪里是找到这些信息的合适地点?
我想使用Open XML SDK 2.0(CTP)更新图表使用的电子表格中的单元格.我找到的所有代码示例都插入了新的单元格.我正在努力检索正确的工作表.
public static void InsertText(string docName, string text, uint rowIndex,
string columnName)
{
// Open the document for editing.
using (SpreadsheetDocument spreadSheet =
SpreadsheetDocument.Open(docName, true))
{
Workbook workBook = spreadSheet.WorkbookPart.Workbook;
WorksheetPart worksheetPart = workBook.WorkbookPart.
WorksheetParts.First();
SheetData sheetData = worksheetPart.Worksheet.
GetFirstChild<SheetData>();
// If the worksheet does not contain a row with the specified
// row index, insert one.
Row row;
if (sheetData.Elements<Row>().Where(
r => r.RowIndex == rowIndex).Count() != 0)
// At this point I am expecting a match …Run Code Online (Sandbox Code Playgroud) 我正在使用Microsoft Open XML SDK 2,我很难在单元格中插入日期.我可以通过设置插入数字而没有问题Cell.DataType = CellValues.Number,但是当我对日期(Cell.DataType = CellValues.Date)执行相同操作时Excel 2010崩溃(2007年也是如此).
我尝试将Cell.Text值设置为多种日期格式以及Excel的日期/数字格式无济于事.我也尝试使用样式,删除type属性,以及我扔在墙上的许多其他比萨...
有人能指出我在工作表中插入日期的例子吗?
我正在尝试使用OpenXML以xlsx格式创建Excel文件,因为我需要在Web服务器上使用它.
填写表格中的值没有任何问题; 但是我很难在单元格中设置经典的日期格式.
下面是使用DocumentFormat.OpenXml和WindowsBase引用的快速测试.
class Program
{
static void Main(string[] args)
{
BuildExel(@"C:\test.xlsx");
}
public static void BuildExel(string fileName)
{
using (SpreadsheetDocument myWorkbook =
SpreadsheetDocument.Create(fileName,
SpreadsheetDocumentType.Workbook))
{
// Workbook Part
WorkbookPart workbookPart = myWorkbook.AddWorkbookPart();
var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
string relId = workbookPart.GetIdOfPart(worksheetPart);
// File Version
var fileVersion = new FileVersion { ApplicationName = "Microsoft Office Excel" };
// Style Part
WorkbookStylesPart wbsp = workbookPart.AddNewPart<WorkbookStylesPart>();
wbsp.Stylesheet = CreateStylesheet();
wbsp.Stylesheet.Save();
// Sheets
var sheets = new Sheets();
var sheet = …Run Code Online (Sandbox Code Playgroud) 使用Open XML SDK v2.0创建Excel电子表格时,我们的Excel输出最初成功运行了几个月.最近Excel(所有版本)开始抱怨"Excel在'zot.xlsx'中找到了不可读的内容.你想恢复这个工作簿的内容吗?".我们使用MemoryStream作为存储在Web应用程序中创建文件,然后将其作为byte []发送到HTTP响应中,MIME类型为"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet".坏文件的解压缩内容与没有错误的文件的解压缩内容相同.
这就是我在做的事情:
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)