1. 程式人生 > >不依賴Excel是否安裝的Excel導入導出類

不依賴Excel是否安裝的Excel導入導出類

arp GridView public rop urn combo order alignment 泛型

本文利用第三方開源庫NPOI實現Excel97-2003,Excel2007+的數據導入導出操作。

不依賴Office是否安裝。NPOI開源項目地址:http://npoi.codeplex.com/。

庫文件下載:http://npoi.codeplex.com/releases/view/115353


using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using NPOI.HPSF;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using NPOI.XSSF.Util;

namespace Youwei.Common
{
    /// <summary>
    /// Excel操作類。利用第三方開源庫NPOI實現Excel97-2003。Excel2007+的數據導入導出操作。

不依賴Office是否安裝。

/// NPOI開源項目地址:http://npoi.codeplex.com/ /// </summary> public class ExcelHelper { private static String FilterExcel = "Excel文件 (*.xls;*.xlsx)|*.xls;*.xlsx"; /// <summary> /// 從網格將數據導出到Excel,支持Excel97-2003(.xls)、Excel2007+(.xlsx) /// </summary> /// <param name="dgv">網格</param> /// <param name="ignoredColumns">要忽略導出的列名稱集合</param> /// <param name="fileName">導出到的文件名稱。為空時將彈出保存對話框</param> public static void ExportToExcel(DataGridView dgv, List<string> ignoredColumns = null, string fileName = "") { if (String.IsNullOrEmpty(fileName)) fileName = Dialog.SaveFileDialog(FilterExcel); if (String.IsNullOrEmpty(fileName)) return; bool isSuccess = false; IWorkbook workBook = null; ISheet sheet = null; IRow dataRow = null; try { //不同格式實例化不同工作薄 if (fileName.EndsWith(".xls")) workBook = new HSSFWorkbook(); else if (fileName.EndsWith(".xlsx")) workBook = new XSSFWorkbook(); sheet = workBook.CreateSheet(); dataRow = sheet.CreateRow(0); //表頭樣式 ICellStyle headerStyle = workBook.CreateCellStyle(); headerStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; headerStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; headerStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; headerStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; headerStyle.BottomBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index; headerStyle.LeftBorderColor = HSSFColor.Black.Index; headerStyle.RightBorderColor = HSSFColor.Black.Index; headerStyle.TopBorderColor = HSSFColor.Black.Index; IFont font = workBook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 700; headerStyle.SetFont(font); headerStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; int i = 0, j = 0; int ignoreCnt = 0; //填充表頭 for (i = 0; i < dgv.Columns.Count; i++) { if ((ignoredColumns != null && ignoredColumns.Contains(dgv.Columns[i].Name)) || !dgv.Columns[i].Visible || string.IsNullOrEmpty(dgv.Columns[i].HeaderText)) { ignoreCnt++; continue; } dataRow.CreateCell(i - ignoreCnt).SetCellValue(dgv.Columns[i].HeaderText); dataRow.Cells[i - ignoreCnt].CellStyle = headerStyle; } //內容樣式 ICellStyle cellStyle = headerStyle; cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left; font = workBook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 100; cellStyle.SetFont(font); //填充內容 DataGridViewCell cell = null; for (i = 0; i < dgv.Rows.Count; i++) { dataRow = sheet.CreateRow(i + 1); ignoreCnt = 0; for (j = 0; j < dgv.Columns.Count; j++) { if ((ignoredColumns != null && ignoredColumns.Contains(dgv.Columns[j].Name)) || !dgv.Columns[j].Visible || string.IsNullOrEmpty(dgv.Columns[j].HeaderText)) { ignoreCnt++; continue; } cell = dgv[j, i]; if (cell is DataGridViewComboBoxCell) dataRow.CreateCell(j - ignoreCnt).SetCellValue(ConvertHelper.ToString(cell.FormattedValue)); else dataRow.CreateCell(j - ignoreCnt).SetCellValue(ConvertHelper.ToString(cell.Value)); dataRow.Cells[j - ignoreCnt].CellStyle = cellStyle; } } //寫文件 using (MemoryStream ms = new MemoryStream()) { using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { workBook.Write(ms); ms.Flush(); ms.Position = 0; byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); data = null; isSuccess = true; } } //打開文件 if (isSuccess && Dialog.Confirm("數據已經導出到Excel成功,你要打開嗎?") == DialogResult.Yes) { Util.OpenFile(fileName); } } catch (Exception ex) { Dialog.Error(ex, System.Reflection.MethodBase.GetCurrentMethod(), true); } finally { if (dataRow != null) dataRow = null; if (sheet != null) sheet = null; if (workBook != null) { workBook.Clear(); workBook = null; } } } /// <summary> /// 從Excel導入數據到實體類集合。支持Excel97-2003(.xls)、Excel2007+(.xlsx) /// </summary> /// <typeparam name="T">實體類</typeparam> /// <param name="fileName">要導入的Excel文件名稱。為空時將彈出保存對話框</param> /// <param name="propertyTextNamePair">實體類屬性的名稱及屬性名相應鍵值對</param> /// <param name="startSheet">導入的起始Excel表單序號</param> /// <param name="startRow">導入的起始Excel行號</param> /// <param name="startColumn">導入的起始Excel列號</param> /// <returns>泛型實體類集合</returns> public static List<T> ImportFromExcel<T>(string fileName, Dictionary<string, string> propertyTextNamePair, int startSheet = 0, int startRow = 0, int startColumn = 0) where T : new() { List<T> list = new List<T>(); if (String.IsNullOrEmpty(fileName) || !System.IO.File.Exists(fileName)) fileName = Dialog.OpenFileDialog(FilterExcel); if (String.IsNullOrEmpty(fileName) || !System.IO.File.Exists(fileName)) return list; IWorkbook workBook = null; ISheet sheet = null; IRow row = null; try { //載入文檔 using (FileStream fileStream = new FileStream(fileName, FileMode.Open)) { //不同格式實例化不同工作薄 if (fileName.EndsWith(".xls")) workBook = new HSSFWorkbook(fileStream); else if (fileName.EndsWith(".xlsx")) workBook = new XSSFWorkbook(fileStream); } //載入指定工作薄 sheet = workBook.GetSheetAt(startSheet); //workBook.NumberOfSheets //工作薄的表單數 //載入表頭 IRow headerRow = sheet.GetRow(startRow); ICell cellHeader = null; ICell cell = null; int cellCount = headerRow.LastCellNum; //獲取實體類屬性 Type type = typeof(T); PropertyInfo[] ps = type.GetProperties(); T t = default(T); PropertyInfo p = null; //遍歷行列,賦值到實體類,並加入到實體類集合 for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++) { row = sheet.GetRow(i); t = new T(); for (int j = 0; j < cellCount; j++) { cellHeader = headerRow.GetCell(j); cell = row.GetCell(j); if (propertyTextNamePair != null && propertyTextNamePair.ContainsKey(cellHeader.ToString())) p = type.GetProperty(propertyTextNamePair[cellHeader.ToString()]); else p = type.GetProperty(cellHeader.ToString()); if (p != null) p.SetValue(t, Convert.ChangeType(cell.ToString(), p.PropertyType), null); } list.Add(t); } //回收資源 ps = null; cellHeader = null; headerRow = null; } catch (Exception ex) { Dialog.Error(ex, System.Reflection.MethodBase.GetCurrentMethod(), true); } finally { if (row != null) row = null; if (sheet != null) sheet = null; if (workBook != null) { workBook.Clear(); workBook = null; } } return list; } } }



不依賴Excel是否安裝的Excel導入導出類