簡體   English   中英

如何在C#Interop中保留Excel單元格格式?

[英]How to persist Excel cell formats in C# Interop?

我正在使用C#中的Microsoft.Office.Interop.Excel以編程方式閱讀Excel工作表。 我能夠逐行讀取並將每一行轉換為字符串arrray。 然后,我將這些行添加到DataTable中。 除了Excel中的列之一包含日期值之外,其他所有東西都工作正常,當我從Excel Range對象中獲取日期並將其轉換為字符串數組時,日期值將轉換為某種十進制數字。 對於例如

  • 如果日期值為'6/4/2016 8:14:39 PM',則得到的值為'42522.5224305556'
  • 如果日期值為'5/27/2016 1:10:12 PM',則得到的值為'42517.54875'

以下是我的代碼-

private System.Data.DataTable GetTicketsFromExcel(string excelFilePath)
    {
        System.Data.DataTable dtblTickets = new System.Data.DataTable();
        Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
        Worksheet ws = new Worksheet();
        Workbook wb = null;

        try
        {
            wb = excelApp.Workbooks.Open(excelFilePath, Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing,
                                               Type.Missing, Type.Missing);

            ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets.get_Item(1);
            Range usedRange = ws.UsedRange;
            Range rowRange;
            string[] lsRow = null;

            for (int i = 1; i <= usedRange.Columns.Count; i++)
            {
                dtblTickets.Columns.Add(usedRange.Cells[5, i].Value.ToString());
            }

            string sortColumn = "Reported On";
            string sortDirection = "DESC";
            dtblTickets.Columns[sortColumn].DataType = typeof(DateTime);

            for (int row = 6; row <= usedRange.Rows.Count; row++)
            {
                //dtblTickets.Columns.Add()
                rowRange = usedRange.Rows[row];
                object[,] cellValues = (object[,])rowRange.Value2;
                lsRow = cellValues.Cast<object>().Select(o => Convert.ToString(o)).ToArray<string>();
                dtblTickets.Rows.Add(lsRow.ToArray());
            }
            dtblTickets.DefaultView.Sort = sortColumn + " " + sortDirection;
            dtblTickets = dtblTickets.DefaultView.ToTable();
        }
        catch (Exception ex)
        {

        }
        finally
        {
            wb.Close();
            excelApp.Quit();
            Marshal.ReleaseComObject(ws);
            Marshal.ReleaseComObject(wb);
            Marshal.ReleaseComObject(excelApp);
            ws = null;
            wb = null;
            excelApp = null;
        }
        return dtblTickets;
    }

請注意-

  • 我不想使用OLEDB讀取和導出此內容
  • 我希望能夠逐行讀取Excel(而無需提取每個單元格值並進行轉換)
  • 我不想轉換/格式化原始Excel文檔數據

有人可以幫我嗎?

不太確定,是否要用這種方法解決問題,但是一種方法是更改​​Excel中單元格(或整個行或列)的屬性。

  • 右鍵單擊單元格
  • 格式化單元格
  • 在“數字”下,為單元格選擇類別“文本”。

我已經對其進行了測試,並且效果良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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