该篇文章大部分内容来自于http://www.cnblogs.com/polk6/p/4425620.html
Excel导入导出第三方类库有 NPOI EPPLUS 以及DocX ,以下仅对NPOI EPPLUS 做介绍,两者原理大致是相同的。以下内容介绍以NPOI为准,会附上EPPLUS的源码。
实际项目中使用的是EPPLUS,多用导出,因数据量在千条之内,对于该组件性能方面的未做深入了解。有兴趣的可以自己研究一下。
本篇介绍Excel的导出功能,导入功能将在C# Excel导入导出(二)中做介绍。
一、Excel理解
WorkBook:即一个Excel文件WorkSheet:每个WorkBook里面都会包含多个WorkSheet
Row:每个WorkSheet里面有多行
二、Excel导入
2.1 操作流程
2.2 NOPI 以及C# 操作代码
public WebApiResult ExpExcelStockMonthyReportListNPOI(StockMonthyQueryModel queryModel)
{
var result = new WebApiResult();
try
{
// 1.获取数据集合
var list = _reportServive.GetStockMonthyList(queryModel).Data.ToList();
// 2.设置单元格抬头
// key:实体对象属性名称,可通过反射获取值
// value:Excel列的名称
Dictionary cellheader = new Dictionary {
{ "wname", "一级仓库" },
{ "secondwname", "二级仓库" },
{ "mname", "物料名称" },
{ "mtype", "物料类型" },
{ "thissum", "库存余额" },
{ "checkdate", "结余时间" }
};
// 3.进行Excel转换操作,并返回转换的文件下载链接
string urlPath = EntityListToExcel(cellheader, list, "库存余额");
result.Data = urlPath;
}
catch (Exception ex)
{
throw ex;
}
return result;
}
///
/// 实体类集合导出到Excle
///
/// 单元头的Key和Value:{ { "UserName", "姓名" }, { "Age", "年龄" } };
/// 数据源
/// 工作表名称
/// 文件的下载地址
public static string EntityListToExcel(Dictionary cellHeard, IList enList, string sheetName)
{
try
{
string fileName = sheetName + "-" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls"; // 文件名称
string urlPath = "upload/" + fileName; // 文件下载的URL地址,供给前台下载
string filePath = HttpContext.Current.Server.MapPath("\\" + urlPath); // 文件路径
// 1.检测是否存在文件夹,若不存在就建立个文件夹
string directoryName = Path.GetDirectoryName(filePath);
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
}
// 2.解析单元格头部,设置单元头的中文名称
HSSFWorkbook workbook = new HSSFWorkbook(); // 工作簿
ISheet sheet = workbook.CreateSheet(sheetName); // 工作表
IRow row = sheet.CreateRow(0);
List keys = cellHeard.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
row.CreateCell(i).SetCellValue(cellHeard[keys[i]]); // 列名为Key的值
}
// 3.List对象的值赋值到Excel的单元格里
int rowIndex = 1; // 从第二行开始赋值(第一行已设置为单元头)
foreach (var en in enList)
{
IRow rowTmp = sheet.CreateRow(rowIndex);
for (int i = 0; i < keys.Count; i++) // 根据指定的属性名称,获取对象指定属性的值
{
string cellValue = ""; // 单元格的值
object properotyValue = null; // 属性的值
System.Reflection.PropertyInfo properotyInfo = null; // 属性的信息
// 3.1 若属性头的名称包含'.',就表示是子类里的属性,那么就要遍历子类,eg:UserEn.UserName
if (keys[i].IndexOf(".") >= 0)
{
// 3.1.1 解析子类属性(这里只解析1层子类,多层子类未处理)
string[] properotyArray = keys[i].Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
string subClassName = properotyArray[0]; // '.'前面的为子类的名称
string subClassProperotyName = properotyArray[1]; // '.'后面的为子类的属性名称
System.Reflection.PropertyInfo subClassInfo = en.GetType().GetProperty(subClassName); // 获取子类的类型
if (subClassInfo != null)
{
// 3.1.2 获取子类的实例
var subClassEn = en.GetType().GetProperty(subClassName).GetValue(en, null);
// 3.1.3 根据属性名称获取子类里的属性类型
properotyInfo = subClassInfo.PropertyType.GetProperty(subClassProperotyName);
if (properotyInfo != null)
{
properotyValue = properotyInfo.GetValue(subClassEn, null); // 获取子类属性的值
}
}
}
else
{
// 3.2 若不是子类的属性,直接根据属性名称获取对象对应的属性
properotyInfo = en.GetType().GetProperty(keys[i]);
if (properotyInfo != null)
{
properotyValue = properotyInfo.GetValue(en, null);
}
}
// 3.3 属性值经过转换赋值给单元格值
if (properotyValue != null)
{
cellValue = properotyValue.ToString();
// 3.3.1 对时间初始值赋值为空
if (cellValue.Trim() == "0001/1/1 0:00:00" || cellValue.Trim() == "0001/1/1 23:59:59")
{
cellValue = "";
}
}
// 3.4 填充到Excel的单元格里
rowTmp.CreateCell(i).SetCellValue(cellValue);
}
rowIndex++;
}
// 4.生成文件
FileStream file = new FileStream(filePath, FileMode.Create);
workbook.Write(file);
file.Close();
// 5.返回下载路径
return urlPath;
}
catch (Exception ex)
{
throw ex;
}
}
2.3 EPPLUS 以及C# 操作代码
public virtual WebApiResult ExpExcelStockMonthyReportList(StockMonthyQueryModel queryModel)
{
var result = new WebApiResult();
//数据集
DataSet ds = new DataSet();
//数据表
DataTable dt = new DataTable();
//数据列
DataColumn dtColumn;
//数据行
DataRow dtRow;
#region 表结构构建
dtColumn = new DataColumn();
dtColumn.DataType = Type.GetType("System.String");
dtColumn.ColumnName = "一级仓库";
dt.Columns.Add(dtColumn);
dtColumn = new DataColumn();
dtColumn.DataType = Type.GetType("System.String");
dtColumn.ColumnName = "二级仓库";
dt.Columns.Add(dtColumn);
dtColumn = new DataColumn();
dtColumn.DataType = Type.GetType("System.String");
dtColumn.ColumnName = "物料名称";
dt.Columns.Add(dtColumn);
dtColumn = new DataColumn();
dtColumn.DataType = Type.GetType("System.String");
dtColumn.ColumnName = "物料类型";
dt.Columns.Add(dtColumn);
dtColumn = new DataColumn();
dtColumn.DataType = Type.GetType("System.String");
dtColumn.ColumnName = "库存余额";
dt.Columns.Add(dtColumn);
dtColumn = new DataColumn();
dtColumn.DataType = Type.GetType("System.String");
dtColumn.ColumnName = "结余时间";
dt.Columns.Add(dtColumn);
#endregion
try
{
#region 信息的获取
queryModel.Paging.PageIndex = 1;
queryModel.Paging.PageSize = -1;
var list = _reportServive.GetStockMonthyList(queryModel);
foreach (var item in list.Data)
{
dtRow = dt.NewRow();
dtRow["一级仓库"] = item.wname;
dtRow["二级仓库"] = item.secondwname;
dtRow["物料名称"] = item.mname;
dtRow["物料类型"] = item.mtype;
dtRow["库存余额"] = item.thissum;
dtRow["结余时间"] = item.checkdate;
dt.Rows.Add(dtRow);
}
ds.Merge(dt);
#endregion
#region Excel 导出
string filename = "库存月结报表" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
string filepath = HttpRuntime.AppDomainAppPath + "upload\\" + @filename;
if (ExcelExport(ds, filepath))
{
result.Data = filename;
}
#endregion
}
catch (Exception e)
{
result.AddError(e.Message);
}
return result;
}
public static bool ExcelExport(DataSet ds, string filename)
{
try
{
//建立文件
FileInfo newFile = new FileInfo(@filename);
using (ExcelPackage package = new ExcelPackage(newFile))
{
//标签页
int sheet = 1;
foreach (DataTable dt in ds.Tables)
{
//标签页
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("sheet" + sheet);
//设置标题
int k = 1;
foreach (DataColumn dc in dt.Columns)
{
//worksheet.Row(1).Height = 30; //行高度
worksheet.Cells[1, k].Value = dc.ColumnName;
//worksheet.Cells[1, k].Style.Font.Color.SetColor(Color.FromArgb(0, 0, 128)); //列
k++;
}
//数据插入
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
worksheet.Cells[i + 2, j + 1].Value = dt.Rows[i][j];
}
}
++sheet;
}
package.Save();
}
//释放资源
//try
//{
// KillExcel(ds);
//}
//catch
//{
//}
return true;
}
catch (Exception ex)
{
return false;
}
}