C#應用Openxml讀取Excel數據實例。本站提示廣大學習愛好者:(C#應用Openxml讀取Excel數據實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C#應用Openxml讀取Excel數據實例正文
本文實例講述了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#法式設計有所贊助.