[Asp.net]常見數據導入Excel,Excel數據導入數據庫解決方案,總有一款適合你!

引言

項目中經常使用到將數據導入Excel,將Excel中的數據導入數據庫的功能,曾經也查找過相關的內容,將曾經用過的方案總結一下。html

方案一

NPOIweb

NPOI 是 POI 項目的 .NET 版本。POI是一個開源的Java讀寫Excel、WORD等微軟OLE2組件文檔的項目。
使用 NPOI 你就能夠在沒有安裝 Office 或者相應環境的機器上對 WORD/EXCEL 文檔進行讀寫。NPOI是構建在POI 3.x版本之上的,它能夠在沒有安裝Office的狀況下對Word/Excel文檔進行讀寫操做。數據庫

優點服務器

(一)傳統操做Excel遇到的問題:
一、若是是.NET,須要在服務器端裝Office,且及時更新它,以防漏洞,還須要設定權限容許.NET訪問COM+,若是在導出過程當中出問題可能致使服務器宕機。
二、Excel會把只包含數字的列進行類型轉換,原本是文本型的,Excel會將其轉成數值型的,好比編號000123會變成123。
三、導出時,若是字段內容以「-」或「=」開頭,Excel會把它當成公式進行,會報錯。
四、Excel會根據Excel文件前8行分析數據類型,若是正好你前8行某一列只是數字,那它會認爲該列爲數值型,自動將該列轉變成相似1.42702E+17格式,日期列變成包含日期和數字的。
(二)使用NPOI的優點
一、您能夠徹底無償使用該框架
二、包含了大部分EXCEL的特性(單元格樣式、數據格式、公式等等)
三、專業的技術支持服務(24*7全天候) (非免費)
四、支持處理的文件格式包括xls, xlsx, docx.
五、採用面向接口的設計架構( 能夠查看 NPOI.SS 的命名空間)
六、同時支持文件的導入和導出
七、基於.net 2.0 也支持xlsx 和 docx格式(固然也支持.net 4.0)
八、來自全世界大量成功且真實的測試Cases
九、大量的實例代碼
十一、你不須要在服務器上安裝微軟的Office,能夠避免版權問題。
十二、使用起來比Office PIA的API更加方便,更人性化。
1三、你不用去花大力氣維護NPOI,NPOI Team會不斷更新、改善NPOI,絕對省成本。
NPOI之因此強大,並非由於它支持導出Excel,而是由於它支持導入Excel,並能「理解」OLE2文檔結構,這也是其餘一些Excel讀寫庫比較弱的方面。一般,讀入並理解結構遠比導出來得複雜,由於導入你必須假設一切狀況都是可能的,而生成你只要保證知足你本身需求就能夠了,若是把導入需求和生成需求比作兩個集合,那麼生成需求一般都是導入需求的子集,這一規律不只體如今Excel讀寫庫中,也體如今pdf讀寫庫中,目前市面上大部分的pdf庫僅支持生成,不支持導入。架構

構成app

 NPOI 1.2.x主要由POIFS、DDF、HPSF、HSSF、SS、Util六部分組成。框架

NPOI.POIFS
OLE2/ActiveX文檔屬性讀寫庫
NPOI.DDF
Microsoft Office Drawing讀寫庫
NPOI.HPSF
OLE2/ActiveX文檔讀寫庫
NPOI.HSSF
Microsoft Excel BIFF(Excel 97-2003)格式讀寫庫
NPOI.SS
Excel公用接口及Excel公式計算引擎
NPOI.Util
基礎類庫,提供了不少實用功能,可用於其餘讀寫文件格式項目的開發
  NPOI組成部分
NPOI 1.x的最新版爲NPOI 1.2.5,其中包括瞭如下功能:
一、讀寫 OLE2文檔
二、讀寫 DocummentSummaryInformationSummaryInformation
三、基於 LittleEndian的字節讀寫
四、讀寫 Excel BIFF格式
五、識別並讀寫 Excel BIFF中的常見 Record,如RowRecord, StyleRecord, ExtendedFormatRecord
六、支持設置單元格的高、寬、樣式等
七、支持調用部分 Excel內建函數,好比說 sum, countif以及計算符號
八、支持在生成的 XLS內嵌入打印設置,好比說橫向/縱向打印、縮放、使用的紙張等。
NPOI 2.0主要由SS, HPSF, DDF, HSSF, XWPF, XSSF, OpenXml4Net, OpenXmlFormats組成,具體列表以下:
Assembly名稱 模塊/命名空間 說明
NPOI.DLL
NPOI.POIFS
OLE2/ActiveX文檔屬性讀寫庫
NPOI.DLL
NPOI.DDF
微軟Office Drawing讀寫庫
NPOI.DLL
NPOI.HPSF
OLE2/ActiveX文檔讀寫庫
NPOI.DLL
NPOI.HSSF
微軟Excel BIFF(Excel 97-2003, doc)格式讀寫庫
NPOI.DLL
NPOI.SS
Excel公用接口及Excel公式計算引擎
NPOI.DLL
NPOI.Util
基礎類庫,提供了不少實用功能,可用於其餘讀寫文件格式項目的開發
NPOI.OOXML.DLL NPOI.XSSF Excel 2007(xlsx)格式讀寫庫
NPOI.OOXML.DLL NPOI.XWPF Word 2007(docx)格式讀寫庫
NPOI.OpenXml4Net.DLL NPOI.OpenXml4Net OpenXml底層zip包讀寫庫
NPOI.OpenXmlFormats.DLL NPOI.OpenXmlFormats 微軟Office OpenXml對象關係庫

(以上內容來自百度百科)從上表可知NPOI組件已支持excel2007,記得以前用的時候只支持excel2003。好久沒研究過這玩意兒了。ide

案例函數

 官網地址:http://npoi.codeplex.com/,能夠從官網下載NPOI2.X版本的。測試

 首先引入

ICSharpCode.SharpZipLib.dll

NPOI.dll

NPOI.OOXML.dll

NPOI.OpenXml4Net.dll

NPOI.OpenXmlFormats.dll

而後引入命名空間:

using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;

      輔助類

using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NPOI.SS.Formula.Eval;

namespace Wolfy.Common
{
    /// <summary>
    /// 使用NPOI組件
    /// 需引入ICSharpCode.SharpZipLib.dll/NPOI.dll/NPOI.OOXML.dll/NPOI.OpenXml4Net.dll/NPOI.OpenXmlFormats.dll
    /// office2007
    /// </summary>
    public class NPOIExcelHelper
    {
        /// <summary>
        /// 將Excel文件中的數據讀出到DataTable中
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public static DataTable Excel2DataTable(string file, string sheetName, string tableName)
        {
            DataTable dt = new DataTable();
            IWorkbook workbook = null;
            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
            {
                //office2003 HSSFWorkbook
                workbook = new XSSFWorkbook(fs);
            }
            ISheet sheet = workbook.GetSheet(sheetName);
            dt = Export2DataTable(sheet, 0, true);
            return dt;

        }
        /// <summary>
        /// 將指定sheet中的數據導入到datatable中
        /// </summary>
        /// <param name="sheet">指定須要導出的sheet</param>
        /// <param name="HeaderRowIndex">列頭所在的行號,-1沒有列頭</param>
        /// <param name="needHeader"></param>
        /// <returns></returns>
        private static DataTable Export2DataTable(ISheet sheet, int HeaderRowIndex, bool needHeader)
        {
            DataTable dt = new DataTable();
            XSSFRow headerRow = null;
            int cellCount;
            try
            {
                if (HeaderRowIndex < 0 || !needHeader)
                {
                    headerRow = sheet.GetRow(0) as XSSFRow;
                    cellCount = headerRow.LastCellNum;
                    for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
                    {
                        DataColumn column = new DataColumn(Convert.ToString(i));
                        dt.Columns.Add(column);
                    }
                }
                else
                {
                    headerRow = sheet.GetRow(HeaderRowIndex) as XSSFRow;
                    cellCount = headerRow.LastCellNum;
                    for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
                    {
                        ICell cell = headerRow.GetCell(i);
                        if (cell == null)
                        {
                            break;//到最後 跳出循環
                        }
                        else
                        {
                            DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
                            dt.Columns.Add(column);
                        }

                    }
                }
                int rowCount = sheet.LastRowNum;
                for (int i = HeaderRowIndex + 1; i <= sheet.LastRowNum; i++)
                {
                    XSSFRow row = null;
                    if (sheet.GetRow(i) == null)
                    {
                        row = sheet.CreateRow(i) as XSSFRow;
                    }
                    else
                    {
                        row = sheet.GetRow(i) as XSSFRow;
                    }
                    DataRow dtRow = dt.NewRow();
                    for (int j = row.FirstCellNum; j <= cellCount; j++)
                    {
                        if (row.GetCell(j) != null)
                        {
                            switch (row.GetCell(j).CellType)
                            {
                                case CellType.Boolean:
                                    dtRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
                                    break;
                                case CellType.Error:
                                    dtRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
                                    break;
                                case CellType.Formula:
                                    switch (row.GetCell(j).CachedFormulaResultType)
                                    {

                                        case CellType.Boolean:
                                            dtRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);

                                            break;
                                        case CellType.Error:
                                            dtRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);

                                            break;
                                        case CellType.Numeric:
                                            dtRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue);

                                            break;
                                        case CellType.String:
                                            string strFORMULA = row.GetCell(j).StringCellValue;
                                            if (strFORMULA != null && strFORMULA.Length > 0)
                                            {
                                                dtRow[j] = strFORMULA.ToString();
                                            }
                                            else
                                            {
                                                dtRow[j] = null;
                                            }
                                            break;
                                        default:
                                            dtRow[j] = "";
                                            break;
                                    }
                                    break;
                                case CellType.Numeric:
                                    if (DateUtil.IsCellDateFormatted(row.GetCell(j)))
                                    {
                                        dtRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue);
                                    }
                                    else
                                    {
                                        dtRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue);
                                    }
                                    break;
                                case CellType.String:
                                    string str = row.GetCell(j).StringCellValue;
                                    if (!string.IsNullOrEmpty(str))
                                    {

                                        dtRow[j] = Convert.ToString(str);


                                    }
                                    else
                                    {
                                        dtRow[j] = null;
                                    }
                                    break;
                                default:
                                    dtRow[j] = "";
                                    break;
                            }

                        }
                    }
                    dt.Rows.Add(dtRow);
                }

            }
            catch (Exception)
            {

                return null;
            }
            return dt;
        }
        /// <summary>
        /// 將DataTable中的數據導入Excel文件中
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="file"></param>
        public static void DataTable2Excel(DataTable dt, string file, string sheetName)
        {
            IWorkbook workbook = new XSSFWorkbook();
            ISheet sheet = workbook.CreateSheet(sheetName);
            IRow header = sheet.CreateRow(0);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                ICell cell = header.CreateCell(i);
                cell.SetCellValue(dt.Columns[i].ColumnName);
            }
            //數據
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow row = sheet.CreateRow(i + 1);
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    ICell cell = row.CreateCell(j);
                    cell.SetCellValue(dt.Rows[i][j].ToString());
                }
            }
            MemoryStream stream = new MemoryStream();
            workbook.Write(stream);
            byte[] buffer = stream.ToArray();
            using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
            {
                fs.Write(buffer, 0, buffer.Length);
                fs.Flush();
            }
        }
        /// <summary>
        /// 獲取單元格類型
        /// </summary>
        /// <param name="cell"></param>
        /// <returns></returns>
        private static object GetValueType(XSSFCell cell)
        {
            if (cell == null)
            {
                return null;
            }
            switch (cell.CellType)
            {
                case CellType.Blank:
                    return null;
                case CellType.Boolean:
                    return cell.BooleanCellValue;
                case CellType.Error:
                    return cell.ErrorCellValue;

                case CellType.Numeric:
                    return cell.NumericCellValue;
                case CellType.String:
                    return cell.StringCellValue;
                case CellType.Formula:
                default:
                    return "=" + cell.StringCellValue;
            }
        }

    }
}
NPOIExcelHelper

參考:http://www.cnblogs.com/Joetao/articles/3247909.html

測試結果

導入Excel,student.xlsx

導入DataTable,這裏只將數據導入DataTable,導入數據庫部分,就再也不寫了。

測試數據,向qq羣裏一朋友要的。大概有5w多條,lz機子是老爺機跑不起,只導出了其中的1k條。

方案二

利用office的com組件

首先添加com引用

引入命名空間

using Excel = Microsoft.Office.Interop.Excel;

 Com操做Excel輔助類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;
using System.Web.UI;
using System.Web;
using System.Data;
namespace Wolfy.Common
{
    /// <summary>
    /// 使用com組件 操做Excel
    /// </summary>
    public class ComExcelHelper
    {
        private Excel.Application appExcel = null;
        private Excel.Workbook workbook = null;
        private Excel.Worksheet sheet = null;
        private DateTime dtBefore;
        private DateTime dtAfter;
        private string filePath;

        public string FilePath
        {
            get { return filePath; }
            set { filePath = value; }
        }
        private string timestamp;
        /// <summary>
        /// 以時間字符串做爲保存文件的名稱
        /// </summary>
        public string Timestamp
        {
            get { return timestamp; }
            set { timestamp = value; }
        }
        private object mValue = System.Reflection.Missing.Value;
        /// <summary>
        ///是否打開Excel界面 
        /// </summary>
        public bool Visible
        {
            set
            {
                appExcel.Visible = value;
            }
        }
        public ComExcelHelper()
        {
            this.dtBefore = DateTime.Now;
            appExcel = new Excel.Application();
            this.dtAfter = DateTime.Now;
            this.timestamp = DateTime.Now.ToShortDateString().Replace("-", "") + DateTime.Now.ToShortDateString().Replace("-", "") + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString();
        }
        public ComExcelHelper(string strFilePath)
        {
            this.dtBefore = DateTime.Now;
            appExcel = new Excel.Application();
            this.dtAfter = DateTime.Now;
            this.workbook = (Excel.Workbook)appExcel.Workbooks.Open(strFilePath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue);
            this.timestamp = DateTime.Now.ToShortDateString().Replace("-", "") + DateTime.Now.ToShortDateString().Replace("-", "") + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString();
        }
        public void Dispose()
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
                sheet = null;
                workbook.Close(false, mValue, mValue);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                workbook = null;
                appExcel.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel);
                appExcel = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                foreach (System.Diagnostics.Process pro in System.Diagnostics.Process.GetProcessesByName("Excel"))
                {
                    if (pro.StartTime > this.dtBefore && pro.StartTime < this.dtAfter)
                    {
                        pro.Kill();
                    }
                }
            }
            System.GC.SuppressFinalize(this);
        }
        /// <summary>
        /// 加載Excel
        /// </summary>
        public void Load()
        {
            if (workbook == null && this.filePath != null)
            {
                workbook = appExcel.Workbooks.Open(this.filePath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue);
            }
        }
        /// <summary>
        /// 加載Excel
        /// </summary>
        public void Load(string strFilePath)
        {
            if (workbook == null)
            {
                workbook = appExcel.Workbooks.Open(strFilePath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue);
            }
        }
        /// <summary>
        /// 新建工做表
        /// </summary>
        /// <param name="sheetName"></param>
        public void NewWorkSheet(string sheetName)
        {
            sheet = workbook.Sheets.Add(workbook.Sheets[1], mValue, mValue, mValue);
            sheet.Name = sheetName;
        }
        /// <summary>
        /// 在指定的單元格插入指定的值
        /// </summary>
        /// <param name="strCell">單元格 如"A4"</param>
        /// <param name="objValue">文本 數字等值</param>
        public void WriteCell(string strCell, object objValue)
        {
            sheet.get_Range(strCell, mValue).Value2 = objValue;
        }
        /// <summary>
        /// 在指定Range中插入指定的值
        /// </summary>
        /// <param name="strStartCell">Range的開始單元格</param>
        /// <param name="strEndCell">Range的結束單元格</param>
        /// <param name="objValue">文本、數字等值</param>
        public void WriteRange(string strStartCell, string strEndCell, object objValue)
        {
            sheet.get_Range(strStartCell, strEndCell).Value2 = objValue;
        }
        /**/
        /// <summary>
        /// 合併單元格,並在合併後的單元格中插入指定的值
        /// </summary>
        /// <param name="strStartCell"></param>
        /// <param name="strEndCell"></param>
        /// <param name="objValue"></param>
        public void WriteAfterMerge(string strStartCell, string strEndCell, object objValue)
        {
            sheet.get_Range(strStartCell, strEndCell).Merge(mValue);
            sheet.get_Range(strStartCell, mValue).Value2 = objValue;
        }

        /**/
        /// <summary>
        /// 在連續單元格中插入一個DataTable中的值
        /// </summary>
        /// <param name="strStartCell">開始的單元格</param>
        /// <param name="dtData">存儲數據的DataTable</param>
        public void WriteTable(string strStartCell, System.Data.DataTable dtData)
        {
            object[,] arrData = new object[dtData.Rows.Count, dtData.Columns.Count];

            for (int i = 0; i < dtData.Rows.Count; i++)
                for (int j = 0; j < dtData.Columns.Count; j++)
                    arrData[i, j] = dtData.Rows[i][j];

            sheet.get_Range(strStartCell, this.GetEndCell(strStartCell, dtData.Rows.Count - 1, dtData.Columns.Count - 1)).Value2 = arrData;

            arrData = null;
        }

        /**/
        /// <summary>
        /// 在連續單元格中插入一個DataTable並做超級連接
        /// </summary>
        /// <param name="strStartCell">起始單元格標識符</param>
        /// <param name="dtData">存儲數據的DataTable</param>
        /// <param name="strLinkField">連接的地址字段</param>
        /// <param name="strTextField">連接的文本字段</param>
        public void WriteTableAndLink(string strStartCell, System.Data.DataTable dtData, string strLinkField, string strTextField)
        {
            object[,] arrData = new object[dtData.Rows.Count, dtData.Columns.Count - 1];

            for (int i = 0; i < dtData.Rows.Count; i++)
            {
                for (int j = 0; j < dtData.Columns.Count; j++)
                {
                    if (j > dtData.Columns.IndexOf(strLinkField))
                        arrData[i, j - 1] = dtData.Rows[i][j];
                    else if (j < dtData.Columns.IndexOf(strLinkField))
                        arrData[i, j] = dtData.Rows[i][j];
                }
            }

            sheet.get_Range(strStartCell, this.GetEndCell(strStartCell, dtData.Rows.Count - 1, dtData.Columns.Count - 2)).Value2 = arrData;

            for (int i = 0; i < dtData.Rows.Count; i++)
                this.AddHyperLink(this.NtoL(this.LtoN(this.GetCellLetter(strStartCell)) + dtData.Columns.IndexOf(strTextField)) + System.Convert.ToString(this.GetCellNumber(strStartCell) + i), dtData.Rows[i][strLinkField].ToString() + ".htm", "點擊查看詳細", dtData.Rows[i][strTextField].ToString());

            arrData = null;
        }

        /**/
        /// <summary>
        /// 爲單元格設置公式
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        /// <param name="strFormula">公式</param>
        public void SetFormula(string strCell, string strFormula)
        {
            sheet.get_Range(strCell, mValue).Formula = strFormula;
        }
        /**/
        /// <summary>
        /// 設置單元格或連續區域的字體爲黑體
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        public void SetBold(string strCell)
        {
            sheet.get_Range(strCell, mValue).Font.Bold = true;
        }

        /**/
        /// <summary>
        /// 設置連續區域的字體爲黑體
        /// </summary>
        /// <param name="strStartCell">開始單元格標識符</param>
        /// <param name="strEndCell">結束單元格標識符</param>
        public void SetBold(string strStartCell, string strEndCell)
        {
            sheet.get_Range(strStartCell, strEndCell).Font.Bold = true;
        }

        /**/
        /// <summary>
        /// 設置單元格或連續區域的字體顏色
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        /// <param name="clrColor">顏色</param>
        public void SetColor(string strCell, System.Drawing.Color clrColor)
        {
            sheet.get_Range(strCell, mValue).Font.Color = System.Drawing.ColorTranslator.ToOle(clrColor);
        }

        /**/
        /// <summary>
        /// 設置連續區域的字體顏色
        /// </summary>
        /// <param name="strStartCell">開始單元格標識符</param>
        /// <param name="strEndCell">結束單元格標識符</param>
        /// <param name="clrColor">顏色</param>
        public void SetColor(string strStartCell, string strEndCell, System.Drawing.Color clrColor)
        {
            sheet.get_Range(strStartCell, strEndCell).Font.Color = System.Drawing.ColorTranslator.ToOle(clrColor);
        }

        /**/
        /// <summary>
        /// 設置單元格或連續區域的邊框:上下左右都爲黑色連續邊框
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        public void SetBorderAll(string strCell)
        {
            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeTop].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeBottom].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeLeft].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeRight].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideHorizontal].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideVertical].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;


        }

        /**/
        /// <summary>
        /// 設置連續區域的邊框:上下左右都爲黑色連續邊框
        /// </summary>
        /// <param name="strStartCell">開始單元格標識符</param>
        /// <param name="strEndCell">結束單元格標識符</param>
        public void SetBorderAll(string strStartCell, string strEndCell)
        {
            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeTop].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeBottom].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeLeft].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeRight].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideHorizontal].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;

            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideVertical].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
            sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;
        }

        /**/
        /// <summary>
        /// 設置單元格或連續區域水平居左
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        public void SetHAlignLeft(string strCell)
        {
            sheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
        }

        /**/
        /// <summary>
        /// 設置連續區域水平居左
        /// </summary>
        /// <param name="strStartCell">開始單元格標識符</param>
        /// <param name="strEndCell">結束單元格標識符</param>
        public void SetHAlignLeft(string strStartCell, string strEndCell)
        {
            sheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
        }

        /**/
        /// <summary>
        /// 設置單元格或連續區域水平居左
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        public void SetHAlignCenter(string strCell)
        {
            sheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
        }

        /**/
        /// <summary>
        /// 設置連續區域水平居中
        /// </summary>
        /// <param name="strStartCell">開始單元格標識符</param>
        /// <param name="strEndCell">結束單元格標識符</param>
        public void SetHAlignCenter(string strStartCell, string strEndCell)
        {
            sheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
        }

        /**/
        /// <summary>
        /// 設置單元格或連續區域水平居右
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        public void SetHAlignRight(string strCell)
        {
            sheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
        }

        /**/
        /// <summary>
        /// 設置連續區域水平居右
        /// </summary>
        /// <param name="strStartCell">開始單元格標識符</param>
        /// <param name="strEndCell">結束單元格標識符</param>
        public void SetHAlignRight(string strStartCell, string strEndCell)
        {
            sheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
        }

        /**/
        /// <summary>
        /// 設置單元格或連續區域的顯示格式
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        /// <param name="strNF">如"#,##0.00"的顯示格式</param>
        public void SetNumberFormat(string strCell, string strNF)
        {
            sheet.get_Range(strCell, mValue).NumberFormat = strNF;
        }

        /**/
        /// <summary>
        /// 設置連續區域的顯示格式
        /// </summary>
        /// <param name="strStartCell">開始單元格標識符</param>
        /// <param name="strEndCell">結束單元格標識符</param>
        /// <param name="strNF">如"#,##0.00"的顯示格式</param>
        public void SetNumberFormat(string strStartCell, string strEndCell, string strNF)
        {
            sheet.get_Range(strStartCell, strEndCell).NumberFormat = strNF;
        }

        /**/
        /// <summary>
        /// 設置單元格或連續區域的字體大小
        /// </summary>
        /// <param name="strCell">單元格或連續區域標識符</param>
        /// <param name="intFontSize"></param>
        public void SetFontSize(string strCell, int intFontSize)
        {
            sheet.get_Range(strCell, mValue).Font.Size = intFontSize.ToString();
        }

        /**/
        /// <summary>
        /// 設置連續區域的字體大小
        /// </summary>
        /// <param name="strStartCell">開始單元格標識符</param>
        /// <param name="strEndCell">結束單元格標識符</param>
        /// <param name="intFontSize">字體大小</param>
        public void SetFontSize(string strStartCell, string strEndCell, int intFontSize)
        {
            sheet.get_Range(strStartCell, strEndCell).Font.Size = intFontSize.ToString();
        }

        /**/
        /// <summary>
        /// 設置列寬
        /// </summary>
        /// <param name="strColID">列標識,如A表明第一列</param>
        /// <param name="decWidth">寬度</param>
        public void SetColumnWidth(string strColID, double dblWidth)
        {
            ((Excel.Range)sheet.Columns.GetType().InvokeMember("Item", System.Reflection.BindingFlags.GetProperty, null, sheet.Columns, new object[] { (strColID + ":" + strColID).ToString() })).ColumnWidth = dblWidth;
        }

        /**/
        /// <summary>
        /// 爲單元格添加超級連接
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        /// <param name="strAddress">連接地址</param>
        /// <param name="strTip">屏幕提示</param>
        /// <param name="strText">連接文本</param>
        public void AddHyperLink(string strCell, string strAddress, string strTip, string strText)
        {
            sheet.Hyperlinks.Add(sheet.get_Range(strCell, mValue), strAddress, mValue, strTip, strText);
        }

        /**/
        /// <summary>
        /// 已知開始的單元格標識,求intR行、intColumn列後的單元格標識
        /// </summary>
        /// <param name="strStartCell">開始單元格標識</param>
        /// <param name="intR">行數</param>
        /// <param name="intC">列數</param>
        /// <returns>單元格標識符結果</returns>
        public string GetEndCell(string strStartCell, int intR, int intC)
        {
            string endcell = string.Empty;
            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)");
            if (regex.IsMatch(strStartCell))
            {
                endcell = this.NtoL(this.LtoN(regex.Match(strStartCell).Result("${vLetter}")) + intC) + System.Convert.ToString((System.Convert.ToInt32(regex.Match(strStartCell).Result("${vNumber}")) + intR));
            }
            return endcell;

        }

        /**/
        /// <summary>
        /// 獲取單元格標識符中的字母
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        /// <returns>單元格標識符對應的字母</returns>
        public string GetCellLetter(string strCell)
        {
            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)");
            return regex.Match(strCell).Result("${vLetter}");
        }

        /**/
        /// <summary>
        /// 獲取單元格標識符中的數字
        /// </summary>
        /// <param name="strCell">單元格標識符</param>
        public int GetCellNumber(string strCell)
        {
            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)");
            return System.Convert.ToInt32(regex.Match(strCell).Result("${vNumber}"));
        }


        /**/
        /// <summary>
        /// 另存爲xls文件
        /// </summary>
        /// <param name="strFilePath">文件路徑</param>
        public void SaveAs(string strFilePath)
        {
            workbook.SaveCopyAs(strFilePath);

        }

        /**/
        /// <summary>
        /// 另存爲xls文件
        /// </summary>
        /// <param name="strFilePath">文件路徑</param>
        public void Save()
        {
            workbook.Save();

        }
        /// <summary>
        /// 將Excel中的數據 讀入DataTable中
        /// </summary>
        /// <param name="filePath">excel文件的路徑</param>
        /// <param name="dtName">datatable的名字</param>
        /// <param name="headName">表頭,以逗號分隔</param>
        /// <returns></returns>
        public DataTable ReadExcel2DataTable(string filePath, string dtName, string headName)
        {
            workbook = this.appExcel.Workbooks.Open(filePath, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue);
            sheet = workbook.Worksheets.get_Item(1);
            DataTable dt = new DataTable(dtName);
            string[] heads = !string.IsNullOrEmpty(headName) ? headName.Split(',') : null;
            if (heads != null)
            {
                for (int i = 0; i < heads.Length; i++)
                {
                    DataColumn column = new DataColumn(heads[i]);
                    //這裏沒對類型 進行處理
                    dt.Columns.Add(column);
                }
                for (int i = 0; i <= sheet.UsedRange.Rows.Count; i++)
                {
                    DataRow dr = dt.NewRow();
                    for (int j = 0; j < heads.Length; j++)
                    {
                        string cellString = NtoL(j + 1);
                        dr[heads[j]] = sheet.get_Range(cellString + (i + 1)).Value2;

                    }
                    dt.Rows.Add(dr);

                }
            }
            else
            {
                for (int i = 0; i <= sheet.UsedRange.Rows.Count; i++)
                {
                    DataRow dr = dt.NewRow();
                    for (int j = 0; j <= sheet.UsedRange.Columns.Count; j++)
                    {
                        dr[j + 1] = sheet.get_Range(NtoL(j + 1) + (i + 1)).Value2;
                    }
                    dt.Rows.Add(dr);
                }
            }
            return dt;
        }
        /**/
        /// <summary>
        /// 另存爲html文件
        /// </summary>
        /// <param name="strFilePath">文件路徑</param>
        public void SaveHtml(string strFilePath)
        {
            workbook.SaveAs(strFilePath, Excel.XlFileFormat.xlHtml, mValue, mValue, mValue, mValue, Excel.XlSaveAsAccessMode.xlNoChange, mValue, mValue, mValue, mValue, mValue);
        }

        public void CreateHtmlFile()
        {

        }






        /**/
        /// <summary>
        /// 字母轉換爲數字,Excel列頭,如A-1;AA-27
        /// </summary>
        /// <param name="strLetter">字母</param>
        /// <returns>字母對應的數字</returns>
        private int LtoN(string strLetter)
        {
            int intRtn = 0;

            string strLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

            if (strLetter.Length == 2)
                intRtn += (strLetters.IndexOf(strLetter.Substring(0, 1)) + 1) * 26;

            intRtn += strLetters.IndexOf(strLetter.Substring(strLetter.Length - 1, 1)) + 1;

            return intRtn;

        }

        /**/
        /// <summary>
        /// 數字轉換爲字母,Excel列頭,如1-A;27-AA
        /// </summary>
        /// <param name="intNumber">數字</param>
        /// <returns>數字對應的字母</returns>
        private string NtoL(int intNumber)
        {
            if (intNumber > 702)
                return String.Empty;

            if (intNumber == 702)
                return "ZZ";

            string strRtn = String.Empty;

            string strLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

            if (intNumber > 26)
                strRtn = strLetters.Substring(intNumber / 26 - 1, 1);

            strRtn += strLetters.Substring((intNumber % 26) - 1, 1);

            return strRtn;
        }

    }
}
ComExcelHelper

參考:http://www.cnblogs.com/waxdoll/archive/2005/10/28/264071.html

DataTable導入Excel

Excel讀入DataTable

這裏未對類型進行處理,datetime類型的數據會轉換成數值類型的

方案三

將Excel數據表看成數據源,經過 OleDb來實現。

一樣須要引入Microsoft Excel 14.0 Object Library

 分享一個操做類:

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Data;
  5 using System.Data.OleDb;
  6 using System.IO;
  7 using System.Linq;
  8 using System.Text;
  9 using System.Threading.Tasks;
 10 using System.Web;
 11 using System.Web.UI;
 12 using System.Web.UI.WebControls;
 13 
 14 namespace Wolfy.Common
 15 {
 16     class OleDbExcelHelper
 17     {
 18         #region 數據導出至Excel文件
 19         /// </summary> 
 20         /// 導出Excel文件,自動返回可下載的文件流 
 21         /// </summary> 
 22         public static void DataTable1Excel(System.Data.DataTable dtData)
 23         {
 24             GridView gvExport = null;
 25             HttpContext curContext = HttpContext.Current;
 26             StringWriter strWriter = null;
 27             HtmlTextWriter htmlWriter = null;
 28             if (dtData != null)
 29             {
 30                 curContext.Response.ContentType = "application/vnd.ms-excel";
 31                 curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
 32                 curContext.Response.Charset = "utf-8";
 33                 strWriter = new StringWriter();
 34                 htmlWriter = new HtmlTextWriter(strWriter);
 35                 gvExport = new GridView();
 36                 gvExport.DataSource = dtData.DefaultView;
 37                 gvExport.AllowPaging = false;
 38                 gvExport.DataBind();
 39                 gvExport.RenderControl(htmlWriter);
 40                 curContext.Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=gb2312\"/>" + strWriter.ToString());
 41                 curContext.Response.End();
 42             }
 43         }
 44 
 45         /// <summary>
 46         /// 導出Excel文件,轉換爲可讀模式
 47         /// </summary>
 48         public static void DataTable2Excel(System.Data.DataTable dtData)
 49         {
 50             DataGrid dgExport = null;
 51             HttpContext curContext = HttpContext.Current;
 52             StringWriter strWriter = null;
 53             HtmlTextWriter htmlWriter = null;
 54 
 55             if (dtData != null)
 56             {
 57                 curContext.Response.ContentType = "application/vnd.ms-excel";
 58                 curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
 59                 curContext.Response.Charset = "";
 60                 strWriter = new StringWriter();
 61                 htmlWriter = new HtmlTextWriter(strWriter);
 62                 dgExport = new DataGrid();
 63                 dgExport.DataSource = dtData.DefaultView;
 64                 dgExport.AllowPaging = false;
 65                 dgExport.DataBind();
 66                 dgExport.RenderControl(htmlWriter);
 67                 curContext.Response.Write(strWriter.ToString());
 68                 curContext.Response.End();
 69             }
 70         }
 71 
 72         /// <summary>
 73         /// 導出Excel文件,並自定義文件名
 74         /// </summary>
 75         public static void DataTable3Excel(System.Data.DataTable dtData, String FileName)
 76         {
 77             GridView dgExport = null;
 78             HttpContext curContext = HttpContext.Current;
 79             StringWriter strWriter = null;
 80             HtmlTextWriter htmlWriter = null;
 81 
 82             if (dtData != null)
 83             {
 84                 HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8);
 85                 curContext.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xls");
 86                 curContext.Response.ContentType = "application nd.ms-excel";
 87                 curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
 88                 curContext.Response.Charset = "GB2312";
 89                 strWriter = new StringWriter();
 90                 htmlWriter = new HtmlTextWriter(strWriter);
 91                 dgExport = new GridView();
 92                 dgExport.DataSource = dtData.DefaultView;
 93                 dgExport.AllowPaging = false;
 94                 dgExport.DataBind();
 95                 dgExport.RenderControl(htmlWriter);
 96                 curContext.Response.Write(strWriter.ToString());
 97                 curContext.Response.End();
 98             }
 99         }
100 
101         /// <summary>
102         /// 將數據導出至Excel文件
103         /// </summary>
104         /// <param name="Table">DataTable對象</param>
105         /// <param name="ExcelFilePath">Excel文件路徑</param>
106         public static bool OutputToExcel(System.Data.DataTable Table, string ExcelFilePath)
107         {
108             if (File.Exists(ExcelFilePath))
109             {
110                 throw new Exception("該文件已經存在!");
111             }
112 
113             if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))
114             {
115                 Table.TableName = "Sheet1";
116             }
117 
118             //數據表的列數
119             int ColCount = Table.Columns.Count;
120 
121             //用於記數,實例化參數時的序號
122             int i = 0;
123 
124             //建立參數
125             OleDbParameter[] para = new OleDbParameter[ColCount];
126 
127             //建立表結構的SQL語句
128             string TableStructStr = @"Create Table " + Table.TableName + "(";
129 
130             //鏈接字符串
131             string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";
132             OleDbConnection objConn = new OleDbConnection(connString);
133 
134             //建立表結構
135             OleDbCommand objCmd = new OleDbCommand();
136 
137             //數據類型集合
138             ArrayList DataTypeList = new ArrayList();
139             DataTypeList.Add("System.Decimal");
140             DataTypeList.Add("System.Double");
141             DataTypeList.Add("System.Int16");
142             DataTypeList.Add("System.Int32");
143             DataTypeList.Add("System.Int64");
144             DataTypeList.Add("System.Single");
145 
146             //遍歷數據表的全部列,用於建立表結構
147             foreach (DataColumn col in Table.Columns)
148             {
149                 //若是列屬於數字列,則設置該列的數據類型爲double
150                 if (DataTypeList.IndexOf(col.DataType.ToString()) >= 0)
151                 {
152                     para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.Double);
153                     objCmd.Parameters.Add(para[i]);
154 
155                     //若是是最後一列
156                     if (i + 1 == ColCount)
157                     {
158                         TableStructStr += col.ColumnName + " double)";
159                     }
160                     else
161                     {
162                         TableStructStr += col.ColumnName + " double,";
163                     }
164                 }
165                 else
166                 {
167                     para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.VarChar);
168                     objCmd.Parameters.Add(para[i]);
169 
170                     //若是是最後一列
171                     if (i + 1 == ColCount)
172                     {
173                         TableStructStr += col.ColumnName + " varchar)";
174                     }
175                     else
176                     {
177                         TableStructStr += col.ColumnName + " varchar,";
178                     }
179                 }
180                 i++;
181             }
182 
183             //建立Excel文件及文件結構
184             try
185             {
186                 objCmd.Connection = objConn;
187                 objCmd.CommandText = TableStructStr;
188 
189                 if (objConn.State == ConnectionState.Closed)
190                 {
191                     objConn.Open();
192                 }
193                 objCmd.ExecuteNonQuery();
194             }
195             catch (Exception exp)
196             {
197                 throw exp;
198             }
199 
200             //插入記錄的SQL語句
201             string InsertSql_1 = "Insert into " + Table.TableName + " (";
202             string InsertSql_2 = " Values (";
203             string InsertSql = "";
204 
205             //遍歷全部列,用於插入記錄,在此建立插入記錄的SQL語句
206             for (int colID = 0; colID < ColCount; colID++)
207             {
208                 if (colID + 1 == ColCount)  //最後一列
209                 {
210                     InsertSql_1 += Table.Columns[colID].ColumnName + ")";
211                     InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ")";
212                 }
213                 else
214                 {
215                     InsertSql_1 += Table.Columns[colID].ColumnName + ",";
216                     InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ",";
217                 }
218             }
219 
220             InsertSql = InsertSql_1 + InsertSql_2;
221 
222             //遍歷數據表的全部數據行
223             for (int rowID = 0; rowID < Table.Rows.Count; rowID++)
224             {
225                 for (int colID = 0; colID < ColCount; colID++)
226                 {
227                     if (para[colID].DbType == DbType.Double && Table.Rows[rowID][colID].ToString().Trim() == "")
228                     {
229                         para[colID].Value = 0;
230                     }
231                     else
232                     {
233                         para[colID].Value = Table.Rows[rowID][colID].ToString().Trim();
234                     }
235                 }
236                 try
237                 {
238                     objCmd.CommandText = InsertSql;
239                     objCmd.ExecuteNonQuery();
240                 }
241                 catch (Exception exp)
242                 {
243                     string str = exp.Message;
244                 }
245             }
246             try
247             {
248                 if (objConn.State == ConnectionState.Open)
249                 {
250                     objConn.Close();
251                 }
252             }
253             catch (Exception exp)
254             {
255                 throw exp;
256             }
257             return true;
258         }
259 
260         /// <summary>
261         /// 將數據導出至Excel文件
262         /// </summary>
263         /// <param name="Table">DataTable對象</param>
264         /// <param name="Columns">要導出的數據列集合</param>
265         /// <param name="ExcelFilePath">Excel文件路徑</param>
266         public static bool OutputToExcel(System.Data.DataTable Table, ArrayList Columns, string ExcelFilePath)
267         {
268             if (File.Exists(ExcelFilePath))
269             {
270                 throw new Exception("該文件已經存在!");
271             }
272 
273             //若是數據列數大於表的列數,取數據表的全部列
274             if (Columns.Count > Table.Columns.Count)
275             {
276                 for (int s = Table.Columns.Count + 1; s <= Columns.Count; s++)
277                 {
278                     Columns.RemoveAt(s);   //移除數據表列數後的全部列
279                 }
280             }
281 
282             //遍歷全部的數據列,若是有數據列的數據類型不是 DataColumn,則將它移除
283             DataColumn column = new DataColumn();
284             for (int j = 0; j < Columns.Count; j++)
285             {
286                 try
287                 {
288                     column = (DataColumn)Columns[j];
289                 }
290                 catch (Exception)
291                 {
292                     Columns.RemoveAt(j);
293                 }
294             }
295             if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))
296             {
297                 Table.TableName = "Sheet1";
298             }
299 
300             //數據表的列數
301             int ColCount = Columns.Count;
302 
303             //建立參數
304             OleDbParameter[] para = new OleDbParameter[ColCount];
305 
306             //建立表結構的SQL語句
307             string TableStructStr = @"Create Table " + Table.TableName + "(";
308 
309             //鏈接字符串
310             string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";
311             OleDbConnection objConn = new OleDbConnection(connString);
312 
313             //建立表結構
314             OleDbCommand objCmd = new OleDbCommand();
315 
316             //數據類型集合
317             ArrayList DataTypeList = new ArrayList();
318             DataTypeList.Add("System.Decimal");
319             DataTypeList.Add("System.Double");
320             DataTypeList.Add("System.Int16");
321             DataTypeList.Add("System.Int32");
322             DataTypeList.Add("System.Int64");
323             DataTypeList.Add("System.Single");
324 
325             DataColumn col = new DataColumn();
326 
327             //遍歷數據表的全部列,用於建立表結構
328             for (int k = 0; k < ColCount; k++)
329             {
330                 col = (DataColumn)Columns[k];
331 
332                 //列的數據類型是數字型
333                 if (DataTypeList.IndexOf(col.DataType.ToString().Trim()) >= 0)
334                 {
335                     para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.Double);
336                     objCmd.Parameters.Add(para[k]);
337 
338                     //若是是最後一列
339                     if (k + 1 == ColCount)
340                     {
341                         TableStructStr += col.Caption.Trim() + " Double)";
342                     }
343                     else
344                     {
345                         TableStructStr += col.Caption.Trim() + " Double,";
346                     }
347                 }
348                 else
349                 {
350                     para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.VarChar);
351                     objCmd.Parameters.Add(para[k]);
352 
353                     //若是是最後一列
354                     if (k + 1 == ColCount)
355                     {
356                         TableStructStr += col.Caption.Trim() + " VarChar)";
357                     }
358                     else
359                     {
360                         TableStructStr += col.Caption.Trim() + " VarChar,";
361                     }
362                 }
363             }
364 
365             //建立Excel文件及文件結構
366             try
367             {
368                 objCmd.Connection = objConn;
369                 objCmd.CommandText = TableStructStr;
370 
371                 if (objConn.State == ConnectionState.Closed)
372                 {
373                     objConn.Open();
374                 }
375                 objCmd.ExecuteNonQuery();
376             }
377             catch (Exception exp)
378             {
379                 throw exp;
380             }
381 
382             //插入記錄的SQL語句
383             string InsertSql_1 = "Insert into " + Table.TableName + " (";
384             string InsertSql_2 = " Values (";
385             string InsertSql = "";
386 
387             //遍歷全部列,用於插入記錄,在此建立插入記錄的SQL語句
388             for (int colID = 0; colID < ColCount; colID++)
389             {
390                 if (colID + 1 == ColCount)  //最後一列
391                 {
392                     InsertSql_1 += Columns[colID].ToString().Trim() + ")";
393                     InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ")";
394                 }
395                 else
396                 {
397                     InsertSql_1 += Columns[colID].ToString().Trim() + ",";
398                     InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ",";
399                 }
400             }
401 
402             InsertSql = InsertSql_1 + InsertSql_2;
403 
404             //遍歷數據表的全部數據行
405             DataColumn DataCol = new DataColumn();
406             for (int rowID = 0; rowID < Table.Rows.Count; rowID++)
407             {
408                 for (int colID = 0; colID < ColCount; colID++)
409                 {
410                     //由於列不連續,因此在取得單元格時不能用行列編號,列需得用列的名稱
411                     DataCol = (DataColumn)Columns[colID];
412                     if (para[colID].DbType == DbType.Double && Table.Rows[rowID][DataCol.Caption].ToString().Trim() == "")
413                     {
414                         para[colID].Value = 0;
415                     }
416                     else
417                     {
418                         para[colID].Value = Table.Rows[rowID][DataCol.Caption].ToString().Trim();
419                     }
420                 }
421                 try
422                 {
423                     objCmd.CommandText = InsertSql;
424                     objCmd.ExecuteNonQuery();
425                 }
426                 catch (Exception exp)
427                 {
428                     string str = exp.Message;
429                 }
430             }
431             try
432             {
433                 if (objConn.State == ConnectionState.Open)
434                 {
435                     objConn.Close();
436                 }
437             }
438             catch (Exception exp)
439             {
440                 throw exp;
441             }
442             return true;
443         }
444         #endregion
445 
446         /// <summary>
447         /// 獲取Excel文件數據表列表
448         /// </summary>
449         public static ArrayList GetExcelTables(string ExcelFileName)
450         {
451             System.Data.DataTable dt = new System.Data.DataTable();
452             ArrayList TablesList = new ArrayList();
453             if (File.Exists(ExcelFileName))
454             {
455                 using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName))
456                 {
457                     try
458                     {
459                         conn.Open();
460                         dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
461                     }
462                     catch (Exception exp)
463                     {
464                         throw exp;
465                     }
466 
467                     //獲取數據表個數
468                     int tablecount = dt.Rows.Count;
469                     for (int i = 0; i < tablecount; i++)
470                     {
471                         string tablename = dt.Rows[i][2].ToString().Trim().TrimEnd('$');
472                         if (TablesList.IndexOf(tablename) < 0)
473                         {
474                             TablesList.Add(tablename);
475                         }
476                     }
477                 }
478             }
479             return TablesList;
480         }
481 
482         /// <summary>
483         /// 將Excel文件導出至DataTable(第一行做爲表頭)
484         /// </summary>
485         /// <param name="ExcelFilePath">Excel文件路徑</param>
486         /// <param name="TableName">數據表名,若是數據表名錯誤,默認爲第一個數據表名</param>
487         public static DataTable InputFromExcel(string ExcelFilePath, string TableName)
488         {
489             if (!File.Exists(ExcelFilePath))
490             {
491                 throw new Exception("Excel文件不存在!");
492             }
493 
494             //若是數據表名不存在,則數據表名爲Excel文件的第一個數據表
495             ArrayList TableList = new ArrayList();
496             TableList = GetExcelTables(ExcelFilePath);
497 
498             if (TableName.IndexOf(TableName) < 0)
499             {
500                 TableName = TableList[0].ToString().Trim();
501             }
502 
503             DataTable table = new DataTable();
504             OleDbConnection dbcon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0");
505             OleDbCommand cmd = new OleDbCommand("select * from [" + TableName + "$]", dbcon);
506             OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
507 
508             try
509             {
510                 if (dbcon.State == ConnectionState.Closed)
511                 {
512                     dbcon.Open();
513                 }
514                 adapter.Fill(table);
515             }
516             catch (Exception exp)
517             {
518                 throw exp;
519             }
520             finally
521             {
522                 if (dbcon.State == ConnectionState.Open)
523                 {
524                     dbcon.Close();
525                 }
526             }
527             return table;
528         }
529 
530         /// <summary>
531         /// 獲取Excel文件指定數據表的數據列表
532         /// </summary>
533         /// <param name="ExcelFileName">Excel文件名</param>
534         /// <param name="TableName">數據表名</param>
535         public static ArrayList GetExcelTableColumns(string ExcelFileName, string TableName)
536         {
537             DataTable dt = new DataTable();
538             ArrayList ColsList = new ArrayList();
539             if (File.Exists(ExcelFileName))
540             {
541                 using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName))
542                 {
543                     conn.Open();
544                     dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, TableName, null });
545 
546                     //獲取列個數
547                     int colcount = dt.Rows.Count;
548                     for (int i = 0; i < colcount; i++)
549                     {
550                         string colname = dt.Rows[i]["Column_Name"].ToString().Trim();
551                         ColsList.Add(colname);
552                     }
553                 }
554             }
555             return ColsList;
556         }
557     }
558 }
OleDbExcelHelper

網上搜集的經常使用類,這裏再也不測試。

方案四

將Excel另存爲xml文件,對xml文件進行操做。

 1 <Row>
 2     <Cell><Data ss:Type="String">998</Data></Cell>
 3     <Cell><Data ss:Type="String">柳雪巧</Data></Cell>
 4     <Cell><Data ss:Type="String">f</Data></Cell>
 5     <Cell><Data ss:Type="String">1971/4/30 0:00:00</Data></Cell>
 6     <Cell><Data ss:Type="String">2005/1/15 0:00:00</Data></Cell>
 7     <Cell><Data ss:Type="String">臺灣省  屏東縣</Data></Cell>
 8     <Cell><Data ss:Type="String">Dolores19710430@139.com</Data></Cell>
 9     <Cell><Data ss:Type="String">12616310511</Data></Cell>
10     <Cell><Data ss:Type="String">False</Data></Cell>
11     <Cell><Data ss:Type="String">2014/3/15 10:13:54</Data></Cell>
12     <Cell><Data ss:Type="String">5</Data></Cell>
13    </Row>

excel表格中每一行數據,實際上是以上格式的xml,有規律,就能夠很容易的去解析。

方案五

 js插件

官網地址:http://datatables.net/extras/tabletools/

 

方案六

導出爲csv文件

分享一個輔助類

 1 using System.Data;
 2 using System.IO;
 3 
 4 public static class CsvHelper
 5 {
 6     /// <summary>
 7     /// 導出報表爲Csv
 8     /// </summary>
 9     /// <param name="dt">DataTable</param>
10     /// <param name="strFilePath">物理路徑</param>
11     /// <param name="tableheader">表頭</param>
12     /// <param name="columname">字段標題,逗號分隔</param>
13     public static bool dt2csv(DataTable dt, string strFilePath, string tableheader, string columname)
14     {
15         try
16         {
17             string strBufferLine = "";
18             StreamWriter strmWriterObj = new StreamWriter(strFilePath,false,System.Text.Encoding.UTF8);
19             strmWriterObj.WriteLine(tableheader);
20             strmWriterObj.WriteLine(columname);
21             for (int i = 0; i < dt.Rows.Count; i++)
22             {
23                 strBufferLine = "";
24                 for (int j = 0; j < dt.Columns.Count; j++)
25                 {
26                     if (j > 0)
27                         strBufferLine += ",";
28                     strBufferLine += dt.Rows[i][j].ToString();
29                 }
30                 strmWriterObj.WriteLine(strBufferLine);
31             }
32             strmWriterObj.Close();
33             return true;
34         }
35         catch
36         {
37             return false;
38         }
39     }
40 
41     /// <summary>
42     /// 將Csv讀入DataTable
43     /// </summary>
44     /// <param name="filePath">csv文件路徑</param>
45     /// <param name="n">表示第n行是字段title,第n+1行是記錄開始</param>
46     public static DataTable csv2dt(string filePath, int n, DataTable dt)
47     {
48         StreamReader reader = new StreamReader(filePath, System.Text.Encoding.UTF8, false);
49         int i = 0, m = 0;
50         reader.Peek();
51         while (reader.Peek() > 0)
52         {
53             m = m + 1;
54             string str = reader.ReadLine();
55             if (m >= n + 1)
56             {
57                 string[] split = str.Split(',');
58 
59                 System.Data.DataRow dr = dt.NewRow();
60                 for (i = 0; i < split.Length; i++)
61                 {
62                     dr[i] = split[i];
63                 }
64                 dt.Rows.Add(dr);
65             }
66         }
67         return dt;
68     }
69 }
View Code

再也不測試。

方案七

使用模版的方式,最簡單的模版,就是將表頭列出,而後再導入數據。第一行爲表頭,從第二行開始寫入數據。導入過程可參考前面的解決方案。

方案八

使用Aspose.Cells組件,貌似收費。

可參考:http://www.cnblogs.com/lanyue52011/p/3372452.html

http://www.cnblogs.com/hongjiumu/archive/2013/03/15/2962277.html

http://www.cnblogs.com/wujy/archive/2012/07/19/2600162.html

方案九

OpenXML

 OpenXML庫:DocumentFormat.OpenXml.dll;

 參考:http://www.cnblogs.com/zlgcool/archive/2008/12/31/1365993.html

http://blog.sina.com.cn/s/blog_46e9573c01011bvs.html

方案十

       Epplus操做Excel200七、2010

 參考:http://www.cnblogs.com/xinchen/archive/2012/02/15/2352920.html

http://blog.csdn.net/rrrrssss00/article/details/6590944

總結

列出常見的幾種解決方案,在實際項目中,用哪種,仍是根據項目環境來決定吧。

最近項目中用到了Excel導出,導入的功能,就想着將常見的方式總結一下。也許還有遺漏,請留言,將你知道也分享給你們,謝謝。

若是該文章對你有所幫助,不妨推薦一下,讓更多的人知道,畢竟分享是件快樂的事情。

代碼下載:連接:http://pan.baidu.com/s/1dD3lleT 密碼:axli

相關文章
相關標籤/搜索