调用Office组件
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
-
- using ZG.ERP.App.AppPublic;
- using ZG.ERP.Common.SysParameter;
- using ZG.ERP.Common.Data;
- using ZG.ERP.Common.Utility;
- using System.IO;
- using System.Diagnostics;
- using System.Data.OleDb;
- using System.Runtime.InteropServices;
-
-
-
- //打开并读取Excel模板
- Microsoft.Office.Interop.Excel.Application application; //这是一个客户端
- Microsoft.Office.Interop.Excel.Workbooks workbooks; //所有工作薄
- Microsoft.Office.Interop.Excel.Worksheet worksheet;//工作表
- Microsoft.Office.Interop.Excel.Workbook workbook; //所用到的工作表
-
- application = new Microsoft.Office.Interop.Excel.Application();
-
- try
- {
- workbooks = application.Workbooks;
- workbook = workbooks.Open(
- filePath, Type.Missing, Type.Missing,
- Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
- Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
- Type.Missing, Type.Missing);
- worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1];
- Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, 1];
-
- //dtExcelData.Columns.Add("SKU编号");
- dtExcelData.Columns.Add("品名");
- dtExcelData.Columns.Add("材质");
- dtExcelData.Columns.Add("钢厂");
- dtExcelData.Columns.Add("规格");
- dtExcelData.Columns.Add("预定数量(件)");
- dtExcelData.Columns.Add("预定重量(吨)");
- dtExcelData.Columns.Add("预付单价(元)");
- dtExcelData.Columns.Add("预付款小计(元)");
- dtExcelData.Columns.Add("备注");
-
-
- string productName;
- string material;
- string factory;
- string specification;
- string FLAN_num;
- string Quantity;
- string FLAN_price;
- string totalPiece;
- string remark;
-
- //循环读取Excel内容放入DataTable
- for (int i = 2; i <= worksheet.UsedRange.Rows.Count; i++)
- {
- if (((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 2]).Value2 == null)
- {
- continue;
- }
- productName = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 1]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 1]).Value2.ToString() : string.Empty;
- material = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 2]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 2]).Value2.ToString() : string.Empty;
- factory = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 3]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 3]).Value2.ToString() : string.Empty;
- specification = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 4]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 4]).Value2.ToString() : string.Empty;
- Quantity = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 5]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 5]).Value2.ToString() : string.Empty;
- FLAN_num = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 6]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 6]).Value2.ToString() : string.Empty;
- FLAN_price = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 7]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 7]).Value2.ToString() : string.Empty;
- totalPiece = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 8]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 8]).Value2.ToString() : string.Empty;
- remark = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 9]).Value2 != null ?
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, 9]).Value2.ToString() : string.Empty;
-
- dtExcelData.Rows.Add(new object[] { productName, material,factory, specification,Quantity, FLAN_num,
- FLAN_price, totalPiece, remark});
- }
-
- workbook.Close(Type.Missing, filePath, Type.Missing);
- workbooks.Close();
- }
- catch { }
- finally
- {
- application.Quit();
-
- //杀Excel进程
- IntPtr t = new IntPtr(application.Hwnd); //得到这个句柄,具体作用是得到这块内存入口
- int k = 0;
- GetWindowThreadProcessId(t, out k); //得到本进程唯一标志k
- System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); //得到对进程k的引用
- p.Kill(); //关闭进程k
- }
-
第二种,利用NPOI开源组件导入导出
- //===============================================================================
- //功 能:NPOI开源组件导出导入EXCEL
- //作 者:段晓锋
- //创建日期:2011年11月11日
- //修改历史
- //修 改 人:
- //修改日期:
- //修改描述:
- //===============================================================================
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
- using System.Data;
-
- using ZG.ERP.Common.SysParameter;
- using ZG.ERP.Common.Data;
- using ZG.ERP.Common.Utility;
-
- using NPOI;
- using NPOI.HPSF;
- using NPOI.HSSF;
- using NPOI.POIFS;
- using NPOI.HSSF.Util;
- using NPOI.SS.UserModel;
- using NPOI.HSSF.UserModel;
- using NPOI.Util;
- namespace ZG.ERP.Common.Utility
- {
- /// <summary>
- /// NPOI导出导入帮助类
- /// </summary>
- public class NPOIHelper
- {
- #region NPOI开源组件导出EXCEL方法
- /// <summary>
- /// DataTable导出到Excel的MemoryStream
- /// </summary>
- /// <param name="dtSource">源DataTable</param>
- /// <param name="strHeaderText">表头文本</param>
- public static MemoryStream Export(DataTable dtSource, string strHeaderText, out string errorstr)
- {
- errorstr = "";
- try
- {
- HSSFWorkbook workbook = new HSSFWorkbook();
- ISheet sheet = workbook.CreateSheet();
-
- #region 右击文件 属性信息
- {
- DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
- dsi.Company = "NPOI";
- workbook.DocumentSummaryInformation = dsi;
-
- SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
- si.Author = "找钢网"; //填加xls文件作者信息
- si.ApplicationName = "找钢网ERP"; //填加xls文件创建程序信息
- si.LastAuthor = SysConfig.LoginUserInfo.LoginName; //填加xls文件最后保存者信息
- si.Comments = SysConfig.LoginUserInfo.LoginName; //填加xls文件作者信息
- si.Title = "找钢网"; //填加xls文件标题信息
- si.Subject = "找钢网的码单表格";//填加文件主题信息
- si.CreateDateTime = DateTime.Now;
- workbook.SummaryInformation = si;
- }
- #endregion
-
-
- //取得列宽
- int[] arrColWidth = new int[dtSource.Columns.Count];
- foreach (DataColumn item in dtSource.Columns)
- {
- arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
- }
- for (int i = 0; i < dtSource.Rows.Count; i++)
- {
- for (int j = 0; j < dtSource.Columns.Count; j++)
- {
- int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
- if (intTemp > arrColWidth[j])
- {
- arrColWidth[j] = intTemp;
- }
- }
- }
- int rowIndex = 0;
-
- IRow row0 = sheet.CreateRow(0);//在工作表中添加一行
- ICellStyle headStyle = workbook.CreateCellStyle();
- //headStyle.Alignment =CellHorizontalAlignment.CENTER;
- IFont font = workbook.CreateFont();
- font.FontHeightInPoints = 10;
- font.Boldweight = 700;
- headStyle.SetFont(font);
- foreach (DataColumn column in dtSource.Columns)
- {
- row0.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
- row0.GetCell(column.Ordinal).CellStyle = headStyle;
-
- //设置列宽
- sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
- }
- rowIndex = 1;
- foreach (DataRow row in dtSource.Rows)
- {
- //#region 新建表,填充表头,填充列头,样式
- //if (rowIndex == 65535 || rowIndex == 0)
- //{
- // if (rowIndex != 0)
- // {
- // sheet = workbook.CreateSheet();
- // }
- // rowIndex = 2;
- //}
- //#endregion
-
- #region 填充内容
- IRow dataRow = sheet.CreateRow(rowIndex);
- foreach (DataColumn column in dtSource.Columns)
- {
- ICell newCell = dataRow.CreateCell(column.Ordinal);
-
- string drValue = row[column].ToString();
-
- switch (column.DataType.ToString())
- {
- case "System.String"://字符串类型
- newCell.SetCellValue(drValue);
- break;
- case "System.DateTime"://日期类型
- DateTime dateV;
- DateTime.TryParse(drValue, out dateV);
- newCell.SetCellValue(dateV);
- break;
- case "System.Boolean"://布尔型
- bool boolV = false;
- bool.TryParse(drValue, out boolV);
- newCell.SetCellValue(boolV);
- break;
- case "System.Int16"://整型
- case "System.Int32":
- case "System.Int64":
- case "System.Byte":
- int intV = 0;
- int.TryParse(drValue, out intV);
- newCell.SetCellValue(intV);
- break;
- case "System.Decimal"://浮点型
- case "System.Double":
- double doubV = 0;
- double.TryParse(drValue, out doubV);
- newCell.SetCellValue(doubV);
- break;
- case "System.DBNull"://空值处理
- newCell.SetCellValue("");
- break;
- default:
- newCell.SetCellValue("");
- break;
- }
-
- }
- #endregion
-
- rowIndex++;
- }
- using (MemoryStream ms = new MemoryStream())
- {
- workbook.Write(ms);
- ms.Flush();
- ms.Position = 0;
- //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
- return ms;
- }
- }
- catch(Exception ex)
- {
- errorstr = ex.Message.ToString();
- return null;
- }
- }
-
- #endregion
-
- #region NPOI开源组件导入EXCEL方法
- /// <summary>
- /// xls导入到datatable
- /// </summary>
- /// <param name="dtSource">源DataTable</param>
- /// <param name="strHeaderText">表头文本</param>
- public static DataTable Import(string filePath, out string errorStr)
- {
- try
- {
- errorStr = "";
- HSSFWorkbook hssfworkbook;
- using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
- {
- hssfworkbook = new HSSFWorkbook(file);
- }
- ISheet sheet = hssfworkbook.GetSheetAt(0);
- System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
-
- DataTable dt = new DataTable();
- for (int j = 0; j < 12; j++)
- {
- dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
- }
- while (rows.MoveNext())
- {
- IRow row = (HSSFRow)rows.Current;
- DataRow dr = dt.NewRow();
-
- for (int i = 0; i < row.LastCellNum; i++)
- {
- ICell cell = row.GetCell(i);
- if (cell == null)
- {
- dr[i] = null;
- }
- else
- {
- dr[i] = cell.ToString();
- }
- }
- dt.Rows.Add(dr);
- }
- return dt;
- }
- catch(Exception ex)
- {
- errorStr = ex.Message.ToString();
- return null;
- }
- }
- #endregion
- }
- }
NPOI开源地址:http://npoi.codeplex.com/
MyXls开源地址:
http://sourceforge.net/projects/myxls/