该篇文章大部分内容来自于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;
}
}