You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.9 KiB
140 lines
4.9 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Data.OleDb;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Web;
|
|
using MESClassLibrary.BLL.Log;
|
|
using MESWebSite.CommonClass;
|
|
using NPOI.SS.UserModel;
|
|
using NPOI.XSSF.UserModel;
|
|
|
|
namespace MESWebSite.Tool
|
|
{
|
|
public class ExcelTool
|
|
{
|
|
|
|
/// <summary>
|
|
/// 导出Excel
|
|
/// </summary>
|
|
/// <typeparam name="T">导出的数据集合类型</typeparam>
|
|
/// <param name="data">导出的数据集合</param>
|
|
/// <param name="type">导出的Excel实体类型</param>
|
|
/// <returns></returns>
|
|
public XSSFWorkbook Export<T>(List<T> data, Type type) where T : class
|
|
{
|
|
XSSFWorkbook book = new XSSFWorkbook();
|
|
ISheet sheet = book.CreateSheet("Sheet1");
|
|
|
|
IRow hrow = sheet.CreateRow(0);
|
|
PropertyInfo[] prop = type.GetProperties();
|
|
// 通过反射写入表头
|
|
WriteHeader(hrow, prop);
|
|
// 通国反射写入内容
|
|
WriteContent(sheet, data, prop);
|
|
|
|
return book;
|
|
}
|
|
|
|
public void WriteHeader(IRow row, PropertyInfo[] header)
|
|
{
|
|
for (int i = 0; i < header.Length; i++)
|
|
{
|
|
ICell cell = row.CreateCell(i);
|
|
var col = header[i];
|
|
ExportHeaderAttribute attr = col.GetCustomAttribute<ExportHeaderAttribute>();
|
|
if (attr == null)
|
|
{
|
|
cell.SetCellValue(col.Name);
|
|
}
|
|
else
|
|
{
|
|
cell.SetCellValue(attr.HeaderName);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void WriteContent<T>(ISheet sheet, List<T> data, PropertyInfo[] header)
|
|
{
|
|
for (int i = 0; i < data.Count; i++)
|
|
{
|
|
IRow row = sheet.CreateRow(i + 1);
|
|
for (int j = 0; j < header.Length; j++)
|
|
{
|
|
ICell cell = row.CreateCell(j);
|
|
T o = data[i];
|
|
var prop = o.GetType().GetProperty(header[j].Name);
|
|
if (prop != null)
|
|
{
|
|
cell.SetCellValue(prop.GetValue(o).ToString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static DataTable GetExcelTableByOleDB(string strExcelPath, string tableName)
|
|
{
|
|
OleDbConnection objConn = null;
|
|
try
|
|
{
|
|
DataTable dtExcel = new DataTable();
|
|
//数据表
|
|
DataSet ds = new DataSet();
|
|
//获取文件扩展名
|
|
string strExtension = System.IO.Path.GetExtension(strExcelPath);
|
|
string strFileName = System.IO.Path.GetFileName(strExcelPath);
|
|
//Excel的连接
|
|
|
|
switch (strExtension)
|
|
{
|
|
case ".xls":
|
|
objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1;\"");
|
|
break;
|
|
case ".xlsx":
|
|
objConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1;\"");
|
|
break;
|
|
|
|
default:
|
|
objConn = null;
|
|
break;
|
|
}
|
|
if (objConn == null)
|
|
{
|
|
return null;
|
|
}
|
|
try
|
|
{
|
|
objConn.Open();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
}
|
|
|
|
//获取Excel中所有Sheet表的信息
|
|
//System.Data.DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
|
|
//获取Excel的第一个Sheet表名
|
|
//string tableName = schemaTable.Rows[0][2].ToString().Trim();
|
|
string strSql = "select * from [" + tableName + "$]";
|
|
//获取Excel指定Sheet表中的信息
|
|
OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
|
|
OleDbDataAdapter myData = new OleDbDataAdapter(strSql, objConn);
|
|
myData.Fill(ds, tableName);//填充数据
|
|
objConn.Close();
|
|
//dtExcel即为excel文件中指定表中存储的信息
|
|
dtExcel = ds.Tables[tableName];
|
|
return dtExcel;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (objConn != null)
|
|
{
|
|
objConn.Close();
|
|
}
|
|
LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|