簡體   English   中英

使用OpenXML和C#,Integers和DateTime導出到Excel

[英]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函數應該自動識別以下類型:

  • 布爾
  • 約會時間
  • 十進制
  • 例外
  • SharedStringDefinition

我為冗長的帖子表示歉意。 歸結為以下問題:

  • 我可以使Excel以編程方式處理沒有科學計數法的長整數嗎?
  • 為什么將DateTime輸出為這種奇怪的格式?

若要將單元格值設置為日期格式,必須將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM