я создаю файл excel с помощью OpenXML SDK 2.5. У меня есть класс IDIsposable, который включает переменную
private SpreadsheetDocument ProcessDocument { get; set; }
Я могу вставить ячейку со значением даты:
var cell = GetCell(sheet, columnName, rowIndex); //method return a cell
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.CellValue = new CellValue(dateResult.ToOADate().ToString(CultureInfo.InvariantCulture));
cell.StyleIndex = 0;
В этом состоянии, когда я открываю созданный файл Excel в ячейке, я вижу число. это нормально, я имею в виду, но теперь мне нужно установить формат ячейки... У меня есть методы:
public virtual UInt32 CreateCellFormat(String format)
{
NumberingFormat nf = new NumberingFormat();
nf.FormatCode = format;
if (this.WorkbookStylesPart.Stylesheet.NumberingFormats == null)
{
this.WorkbookStylesPart.Stylesheet.NumberingFormats = new NumberingFormats();
this.WorkbookStylesPart.Stylesheet.NumberingFormats.AppendChild(new NumberingFormats(new NumberingFormat() { NumberFormatId = 0 }));
this.WorkbookStylesPart.Stylesheet.NumberingFormats.Count = 1;
}
var numberFormatId = this.WorkbookStylesPart.Stylesheet.NumberingFormats.Elements<NumberingFormat>().Where(a => a.NumberFormatId.HasValue).Select(a => a.NumberFormatId).Max();
nf.NumberFormatId = numberFormatId == null || numberFormatId < 199 ? 200 : numberFormatId + 1;
this.WorkbookStylesPart.Stylesheet.NumberingFormats.InsertAt(nf, (int)this.WorkbookStylesPart.Stylesheet.NumberingFormats.Count.Value);
this.WorkbookStylesPart.Stylesheet.NumberingFormats.Count++;
return nf.NumberFormatId;
}
public virtual void SetCellStyle(Sheet sheet, UInt32 rowIndex, String columnName, UInt32? fontIndex, UInt32? fillIndex, UInt32? formatIndex)
{
var cell1 = this.GetCell(sheet, columnName, rowIndex);
cell1.StyleIndex = this.CreateCellFormat(sheet, fontIndex, fillIndex, formatIndex);
}
internal virtual UInt32 CreateCellFormat(Sheet sheet, UInt32? fontIndex, UInt32? fillIndex, UInt32? formatIndex)
{
CellFormat cellFormat = new CellFormat();
WorksheetPart workSheetPart = this.GetWorkSheetPart(sheet.Name);
if (fontIndex.HasValue)
{
cellFormat.FontId = fontIndex;
cellFormat.ApplyFont = true;
}
if (fillIndex.HasValue)
{
cellFormat.FillId = fillIndex;
cellFormat.ApplyFill = true;
}
if (formatIndex.HasValue)
{
cellFormat.NumberFormatId = formatIndex;
cellFormat.ApplyNumberFormat = BooleanValue.FromBoolean(true);
}
if (this.ProcessDocument.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats == null)
{
this.ProcessDocument.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats = new CellFormats();
this.ProcessDocument.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Append(new CellFormat());
this.ProcessDocument.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Count = 1;
}
this.ProcessDocument.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.InsertAt(cellFormat,
(int)this.ProcessDocument.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Count.Value);
UInt32 result = this.ProcessDocument.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Count;
this.ProcessDocument.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Count++;
return result;
}
В процессе создания я использовал его:
var formatIndex = excel.CreateCellFormat("dd.mm.yyyy");
excel.AddCellValue(workSheet, row, 6, DateTime.Now);
excel.SetCellStyle(workSheet, row, 6, null, null, formatIndex);
В этот момент, когда я открываю сгенерированный файл Excel, я получаю следующее сообщение: «Excel обнаружил нечитаемое содержимое в 'test.xlsx'. Вы хотите восстановить содержимое этой книги? Если вы доверяете источнику этой книги, нажмите «Да».
После исправления моего сообщения Excel об ошибке в файле "/xl/styles.xml".
Кто-нибудь знает, где я ошибаюсь при создании формата ячейки? Большое спасибо
.NumberFormat
? Т.е.cell1..NumberFormat = "m/d/yyyy"
? - person   schedule 08.05.2014