欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#利用Openxml讀取Excel數(shù)據(jù)實例

 更新時間:2014年09月24日 09:36:34   投稿:shichen2014  
這篇文章主要介紹了C#利用Openxml讀取Excel數(shù)據(jù)的方法,包括使用中的注意點分析及疑難探討,需要的朋友可以參考下

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

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

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

參考代碼如下:

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();

        // 設(shè)置表頭DataTable
        foreach (Cell cell in rows.ElementAt(0))
        {
          dt.Columns.Add((string)GetCellValue(spreadSheetDocument, cell));
        }

        // 添加內(nèi)容
        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 //浮點數(shù)和日期對應(yīng)的cell.DataType都為NULL
      {
        // DateTime.FromOADate((double.Parse(value)); 如果確定是日期就可以直接用過該方法轉(zhuǎn)換為日期對象,可是無法確定DataType==NULL的時候這個CELL 數(shù)據(jù)到底是浮點型還是日期.(日期被自動轉(zhuǎn)換為浮點
        return value;
      }
    }
  }
}

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

相關(guān)文章

  • 如何在C#9 中使用static匿名函數(shù)

    如何在C#9 中使用static匿名函數(shù)

    這篇文章主要介紹了如何在C#9中使用static匿名函數(shù),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • Unity實現(xiàn)仿3D輪轉(zhuǎn)圖效果

    Unity實現(xiàn)仿3D輪轉(zhuǎn)圖效果

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)仿3D輪轉(zhuǎn)圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • c# rsa注冊實現(xiàn)加密文字

    c# rsa注冊實現(xiàn)加密文字

    這篇文章主要介紹了c# rsa注冊實現(xiàn)加密文字,需要的朋友可以參考下
    2014-04-04
  • unity實現(xiàn)UI元素跟隨3D物體

    unity實現(xiàn)UI元素跟隨3D物體

    這篇文章主要為大家詳細介紹了unity實現(xiàn)UI元素跟隨3D物體,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C# 郵箱mail 發(fā)送類

    C# 郵箱mail 發(fā)送類

    此類的功能包括發(fā)送郵件,郵箱格式是否正確,和在不發(fā)送郵件的情況下判斷郵箱用戶名和密碼是否正確,鑒于POP檢查郵箱用戶名和密碼出現(xiàn)錯誤情況返回結(jié)果的延遲,用異步線程解決此問題,見代碼
    2015-06-06
  • C#監(jiān)控文件夾并自動給圖片文件打水印的方法

    C#監(jiān)控文件夾并自動給圖片文件打水印的方法

    這篇文章主要介紹了C#監(jiān)控文件夾并自動給圖片文件打水印的方法,涉及C#針對文件夾及圖片操作的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • C#中ManualResetEvent實現(xiàn)線程的暫停與恢復(fù)

    C#中ManualResetEvent實現(xiàn)線程的暫停與恢復(fù)

    本文主要介紹了C#中ManualResetEvent實現(xiàn)線程的暫停與恢復(fù),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#實現(xiàn)啟用與禁用本地網(wǎng)絡(luò)的方式小結(jié)【3種方式】

    C#實現(xiàn)啟用與禁用本地網(wǎng)絡(luò)的方式小結(jié)【3種方式】

    這篇文章主要介紹了C#實現(xiàn)啟用與禁用本地網(wǎng)絡(luò)的方式,結(jié)合實例形式總結(jié)分析了使用Hnetcfg.dll、Shell32.dll及setupapi.dll三種啟用與禁用本地網(wǎng)絡(luò)的操作方法,需要的朋友可以參考下
    2016-07-07
  • C#使用Task實現(xiàn)異步方法

    C#使用Task實現(xiàn)異步方法

    本文主要介紹了C#使用Task實現(xiàn)異步方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C#實現(xiàn)DataGridView控件行列互換的方法

    C#實現(xiàn)DataGridView控件行列互換的方法

    這篇文章主要介紹了C#實現(xiàn)DataGridView控件行列互換的方法,涉及C#中DataGridView控件元素遍歷與添加操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08

最新評論