[英]Export to Excel using OpenXML and C#, Integers and DateTime
我正在編寫一個應從地圖應用程序導出數據的應用程序。 該應用程序正在使用Silverlight,並且為了方便導出到Excel,我正在使用此庫。 默認情況下,所有數據均以字符串表示。 當我寫入電子表格時,我嘗試解析每個字符串以查看其類型:
string str = kvp.Value;
int i = 0;
long l = 0;
decimal dec = 0;
DateTime dt;
if (int.TryParse(str, out i))
doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(i);
else if (decimal.TryParse(str, out dec))
doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(dec);
else if (long.TryParse(str, out l))
doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(l);
else if (DateTime.TryParse(str, out dt))
doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(dt);
else
doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(str);
除DateTime以及我嘗試解析的社會保險號(在我的情況下為12個字符長)之外,這非常有效。
社會保險號被解析為十進制數,並在Excel中以科學形式顯示。 根據我的閱讀經驗,這在Excel中似乎是一個限制。 但是,如果我標記該單元格,則會在頂部欄中看到正確的數字,您可以在其中編寫公式。 到目前為止,我已經解決了這個問題,只需將這個數字作為一個字符串,並讓最終用戶暫時處理它,但是我真的很希望它成為最終文檔中的一個數字。 這可能嗎?
不過,令我真正困擾的是DateTime。 日期格式來自應用程序:10/15/2013 1:10:00 AM。 在Excel文件中看起來像這樣:2455075。
我檢查了日期格式的源代碼,但似乎不夠熟練,無法確定其中是否有任何錯誤。 對於任何感興趣的人,您都可以在這里查看 。
SetValue函數應該自動識別以下類型:
我為冗長的帖子表示歉意。 歸結為以下問題:
若要將單元格值設置為日期格式,必須將DateTime轉換為OLE Automation Date。 您還可以創建更清晰的方法來寫入單元格值。 像這樣的東西:
public bool UpdateValue(WorkbookPart wbPart, string sheetName, string addressName, string value,
UInt32Value styleIndex, CellValues dataType)
{
// Assume failure.
bool updated = false;
Sheet sheet = wbPart.Workbook.Descendants<Sheet>().Where(
(s) => s.Name == sheetName).FirstOrDefault();
if (sheet != null)
{
Worksheet ws = ((WorksheetPart)(wbPart.GetPartById(sheet.Id))).Worksheet;
Cell cell = InsertCellInWorksheet(ws, addressName);
if (dataType == CellValues.SharedString)
{
// Either retrieve the index of an existing string,
// or insert the string into the shared string table
// and get the index of the new item.
int stringIndex = InsertSharedStringItem(wbPart, value);
cell.CellValue = new CellValue(stringIndex.ToString());
}
else
{
cell.CellValue = new CellValue(value);
}
cell.DataType = new EnumValue<CellValues>(dataType);
if (styleIndex > 0)
cell.StyleIndex = styleIndex;
// Save the worksheet.
ws.Save();
updated = true;
}
return updated;
}
然后像這樣調用此方法(第一次調用是針對String的,第二次調用是針對DateTime的):
UpdateValue(workbookPart, wsName, "D14", "Some text", 0, CellValues.String);
UpdateValue(workbookPart, wsName, "H13", DateTime.Parse("2013-11-01").ToOADate().ToString(CultureInfo.InvariantCulture), 0, CellValues.Date);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.