读excel文件至DataTable
在.net中讀excel文件的代碼網上是多之又多,當初在網上搜索了一段,用的是OLEDB方法,我也不例外,但客戶多次向我公司反映,導入的數據,明明是有值的,但顯示為空.說不能識別文本文字,只能識別數字類型.測試了又測試,在連接字符串中加上"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1",說是可以解決混合類型.但是,實際上,還是不能解決問題.后來,我發現,如果,第一行第一列的數據是數字類型,第二行第一列的數據是文本類型,這時,就會顯示不出第二行第一列的數據,它是一個空值.若是第一行第一列的數據是文本類型,第二行第一列的數據是數字類型,將會正常顯示.后來,我又發現,改HDR=NO;這時,不管是數字類型還是文本類型,都能正常讀出.但是它第一行顯示的格式是這樣的:F1,F2..第二行顯示的才是列名.
最后,網上很多說用?Excel.Application讀,但是速度很慢,為了能讀得出數據,不丟失數據,只好先用這個方法了..
代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;
using System.Data;
namespace Baolida.Shared.Common
{
??? public class ExcelOperate
??? {
??????? [DllImport("User32.dll", CharSet = CharSet.Auto)]
??????? public static extern int GetWindowThreadProcessId(IntPtr hwnd, out?? int ID);
??????? public System.Data.DataTable ReadExcelData(string path)
??????? {
??????????? Excel.Application exc = null;
??????????? Workbooks workBooks = null;
??????????? Workbook workBook = null;
??????????? Worksheet workSheet = null;
??????????? string strValue = "";
??????????? Excel.Range r = null;
??????????? System.Data.DataTable dt = new System.Data.DataTable();
??????????? DataRow myRow;
??????????? object oMissing = System.Reflection.Missing.Value;
??????????? try
??????????? {
??????????????? exc = new Excel.Application();
??????????????? exc.UserControl = true;
??????????????? exc.Application.Workbooks.Open(path, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
??????????????? workBooks = exc.Workbooks;
??????????????? workBook = workBooks[1];
??????????????? workSheet = (Worksheet)workBook.Worksheets[1];
??????????????? int colCount = workSheet.UsedRange.Columns.Count; //獲得列數
??????????????? int rowCount = workSheet.UsedRange.Rows.Count; //獲得行數
??????????????? //獲取字段名稱
??????????????? for (int k = 1; k <= colCount; k++)
??????????????? {
??????????????????? r = (Excel.Range)workSheet.Cells[1, k];
???????????????????
??????????????????? strValue = r.Text.ToString().Trim();
??????????????????? dt.Columns.Add(strValue, System.Type.GetType("System.String"));
??????????????? }
??????????????? //獲取內容
??????????????? for (int i = 2; i <= rowCount; i++)
??????????????? {
??????????????????? myRow = dt.NewRow();
??????????????????? for (int j = 1; j <= colCount; j++)
??????????????????? {
??????????????????????? //取excel單元格中的值
??????????????????????? r = (Excel.Range)workSheet.Cells[i, j];
??????????????????????? strValue = r.Text.ToString().Trim();
??????????????????????? myRow[j - 1] = strValue;
??????????????????? }
???????????????
??????????????????? dt.Rows.Add(myRow);
??????????????? }
??????????????? //關閉當前的excel進程
??????????????? exc.Application.Workbooks.Close();
??????????????? exc.Quit();
??????????????? System.Runtime.InteropServices.Marshal.ReleaseComObject(exc);
??????????????? exc = null;
??????????????? IntPtr t = new IntPtr(exc.Hwnd);
??????????????? int kid = 0;
??????????????? GetWindowThreadProcessId(t, out kid);
??????????????? System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(kid);
??????????????? p.Kill();
??????????? }
??????????? catch { }
??????????? return dt;
??????? }
??? }
}
轉載于:https://www.cnblogs.com/cylx00/archive/2008/05/23/1205868.html
總結
以上是生活随笔為你收集整理的读excel文件至DataTable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio 10将面世
- 下一篇: 第6节 三个败家子(6)——很黄很暴力的