程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#應用Openxml讀取Excel數據實例

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

編輯:C#入門知識

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#法式設計有所贊助.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved