我正在尝试使用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 = new Sheet { Name = "sheetName", SheetId = 1, Id = relId };
sheets.Append(sheet);
// Data
SheetData sheetData = new SheetData(CreateSheetData1());
// Add the parts to the workbook and save
var workbook = new Workbook();
workbook.Append(fileVersion);
workbook.Append(sheets);
var worksheet = new Worksheet();
worksheet.Append(sheetData);
worksheetPart.Worksheet = worksheet;
worksheetPart.Worksheet.Save();
myWorkbook.WorkbookPart.Workbook = workbook;
myWorkbook.WorkbookPart.Workbook.Save();
myWorkbook.Close();
}
}
private static Stylesheet CreateStylesheet()
{
Stylesheet ss = new Stylesheet();
var nfs = new NumberingFormats();
var nformatDateTime = new NumberingFormat
{
NumberFormatId = UInt32Value.FromUInt32(1),
FormatCode = StringValue.FromString("dd/mm/yyyy")
};
nfs.Append(nformatDateTime);
ss.Append(nfs);
return ss;
}
private static List<OpenXmlElement> CreateSheetData1()
{
List<OpenXmlElement> elements = new List<OpenXmlElement>();
var row = new Row();
// Line 1
Cell[] cells = new Cell[2];
Cell cell1 = new Cell();
cell1.DataType = CellValues.InlineString;
cell1.InlineString = new InlineString { Text = new Text { Text = "Daniel" } };
cells[0] = cell1;
Cell cell2 = new Cell();
cell2.DataType = CellValues.Number;
cell2.CellValue = new CellValue((50.5).ToString());
cells[1] = cell2;
row.Append(cells);
elements.Add(row);
// Line 2
row = new Row();
cells = new Cell[1];
Cell cell3 = new Cell();
cell3.DataType = CellValues.Date;
cell3.CellValue = new CellValue(DateTime.Now.ToOADate().ToString());
cell3.StyleIndex = 1; // <= here I try to apply the style...
cells[0] = cell3;
row.Append(cells);
elements.Add(row);
return elements;
}
执行的代码创建Excel文档 . 但是,当我尝试打开文档时,收到此消息:“Excel在'test.xlsx'中找到了不可读的内容 . 你想恢复这个工作簿的内容吗?如果您信任此工作簿的来源,请单击“是” .
如果我删除该行:
cell3.StyleIndex = 1;
我可以打开文档但是日期如果没有格式化,只会显示日期的编号 .
感谢您帮助格式化日期 .
11 回答
这篇博客帮助了我:http://polymathprogrammer.com/2009/11/09/how-to-create-stylesheet-in-excel-open-xml/
我的问题是我想将NumberingFormats添加到样式表而不是添加一个新的样式表 . 如果你想这样做,请使用
而不是
惊喜,订单数量..
另一个大BIG投票:https://github.com/closedxml/closedxml
在尝试从网络上的点点滴滴(包括StackOverFlow)构建我自己的类之后,我找到了上面提到的库,并且片刻之后还有一个功能齐全的Excel文件 .
我已将下面的尝试粘贴到任何感觉完成它的冲动的人的启发下 . 它部分完成,并且日期和字符串单元格创建存在问题 .
在尝试使用此类之前,首先下载closedXML并首先尝试 .
考虑自己警告 .
https://github.com/closedxml/closedxml基本上是我认为的正确答案 .
以下是如何在单元格上应用自定义日期格式 . 首先,我们必须在工作簿的样式表中查找或创建格式:
然后,我们可以使用已解析的styleindex将我们的格式应用于单元格:
我相信你的问题是
NumberFormatId
. 内置数字格式编号为0 - 163.自定义格式必须从164开始 .您的答案可以在What indicates an Office Open XML Cell contains a Date/Time value?找到
诀窍在于,单元格的StyleIndex(s-attribute)实际上是电子表格样式部分中单元格样式(XF元素)列表的索引 . 其中每一个都将指向Samuel提到的预定义数字格式ID . 如果我没记错的话,您要查找的数字格式ID是14或15 .
我有同样的问题,最后我自己导出到Excel编写器 . 代码就在那里解决了这个问题,但你真的会更好地使用整个导出器 . 它很快并且允许细胞的大量格式化 . 你可以在那里查看
https://openxmlexporttoexcel.codeplex.com/
我希望它有所帮助 .
要了解为什么CellValues.Date DataType不起作用(至少在所有Excel版本中都没有),请参阅:
Adding a date in an Excel cell using OpenXML
有关完整,有效且解释良好的解决方案,请参阅:
OpenXML -Writing a date into Excel spreadsheet results in unreadable content
在尝试了很多帖子之后,我发现.ToOADate()和CellValues.Number以及cell.StyleIndex = 4都是需要的...加上!所有模板日期列必须格式化为默认日期样式,以便日期为FILTERABLE作为日期 . 如果没有这些,打开Excel文件时会出现错误,或者值显示为数字 .
我希望以下链接对未来的访问者有所帮助 .
首先,Get the standards documentation .
ECMA-376第4版第1部分是最有用的文件 . 本文档中与此问题相关的部分包括:
30年8月18日
18.8.31 (sematics of this shitty shit)
18.8.45(excel理解的样式的定义)
L.2.7.3.6(如何引用样式)
我在保存文档后遇到了与格式化日期字段相同的问题 . 解决方案是添加数字格式如下:
并添加像这样的单元格: