调用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/