標籤:nta ksh win ring com col using 集錦 讀取
本文執行個體講述了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資料執行個體