1. 程式人生 > >C#利用Openxml讀取Excel數據實例

C#利用Openxml讀取Excel數據實例

select exp ada gin val poi line 浮點數 tom

本文實例講述了C#利用Openxml讀取Excel數據的方法,分享給大家供大家參考。具體分析如下:

這裏有些問題,如果當Cell 裏面是 日期和浮點型的話,對應的Cell.DataType==Null,對應的時間會轉換為一個浮點型,對於這塊可以通過DateTime.FromOADate(double d)轉換為時間。 可是缺點的地方就是,如果Cell.DataType ==NULL, 根本無法確認這個數據到底是 浮點型還是[被轉換為了日期的浮點數]。查閱了很多國外資料,的確國外博客有一部分都反映了。有關Openxml讀取Excel時Cell.DataType==NULL的問題。本例子沒考慮那個問題,現在還沒解決。等後面查詢到更詳細的資料再解決。

其次解決這個問題的方法只有,在數據處理的時候,數據分析我們是可以知道這一列的數據到底是什麽類型,然後根據自己的需求,自己對獲取的數據做相應轉換處理。不過如果使用OleDb的Select語句來讀取Excel的時候,就不會出現這個問題,讀取到Datable時候是日期就不會轉換為浮點型數據。而且對象的Datable對於的那個單元格數據還可以直接強制轉換為DateTime。不過用OleDB讀取數據感覺上應該沒有Openxml目前還沒測試大數據,太晚了。該sleep了。如果有大神了解Openxml讀取表格,請指點[需要解決問題是:EXCEL的表格中CELL 的 DateTime類型和浮點類型數據,在獲取後如何區分。因為使用Openxml獲取後日期會被自動轉換為浮點型]

參考代碼如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ReadExcel
{
  public class Program
  {
    static void Main(string[] args)
    {
      DataTable dt = new DataTable();
      using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(@"Test.xlsx", false))
      {
        WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
        IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
        string relationshipId = sheets.First().Id.Value = sheets.First(x => x.Name == "TestSheet").Id.Value;
        WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
        Worksheet workSheet = worksheetPart.Worksheet;
        SheetData sheetData = workSheet.GetFirstChild<SheetData>();
        Row[] rows = sheetData.Descendants<Row>().ToArray();
        // 設置表頭DataTable
        foreach (Cell cell in rows.ElementAt(0))
        {
          dt.Columns.Add((string)GetCellValue(spreadSheetDocument, cell));
        }
        // 添加內容
        for (int rowIndex = 1; rowIndex < rows.Count(); rowIndex++)
        {
          DataRow tempRow = dt.NewRow();
          for (int i = 0; i < rows[rowIndex].Descendants<Cell>().Count(); i++)
          {
            tempRow[i] = GetCellValue(spreadSheetDocument, rows[rowIndex].Descendants<Cell>().ElementAt(i));
          }
          dt.Rows.Add(tempRow);
        }
      }
      Console.ReadKey();
    }
    public static string GetCellValue(SpreadsheetDocument document, Cell cell)
    {
      SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
      string value = cell.CellValue.InnerXml;
      if (cell.DataType != null && (cell.DataType.Value == CellValues.SharedString || cell.DataType.Value == CellValues.String || cell.DataType.Value == CellValues.Number))
      {
        return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
      }
      else //浮點數和日期對應的cell.DataType都為NULL
      {
        // DateTime.FromOADate((double.Parse(value)); 如果確定是日期就可以直接用過該方法轉換為日期對象,可是無法確定DataType==NULL的時候這個CELL 數據到底是浮點型還是日期.(日期被自動轉換為浮點
        return value;
      }
    }
  }
}

希望本文所述對大家的C#程序設計有所幫助.

除聲明外,跑步客文章均為原創,轉載請以鏈接形式標明本文地址
C#利用Openxml讀取Excel數據實例

本文地址: http://www.paobuke.com/develop/c-develop/pbk23476.html






相關內容

技術分享圖片C#實現文件上傳以及多文件上傳功能技術分享圖片Winform實現鼠標可穿透的窗體鏤空效果技術分享圖片深入講解C#編程中嵌套類型和匿名類型的定義與使用技術分享圖片C#的循環語句集錦及案例詳解
技術分享圖片C#控制臺進行文件讀寫的方法技術分享圖片C#創建縮略圖操作類實例技術分享圖片C#實現多線程的同步方法實例分析技術分享圖片DevExpress設置餅狀圖的Lable位置實例

C#利用Openxml讀取Excel數據實例