原理
根据界面数据报表制作一个有相同列名的excel模板,导入到项目中,之后找到模板路径写入数据,并导出到指定路径
界面Form层
点击导出报表按钮方法内代码
private void btnExport_Click(object sender, EventArgs e)
{
if (ProductInfolist == null || ProductInfolist.Count == 0)
{
MessageHelper.ShowWarning("没有数据可供导出,请先进行数据查询!");
return;
}
FolderBrowserDialog pathDialog = new FolderBrowserDialog();
if (pathDialog.ShowDialog() != DialogResult.OK)
return;
string pathNameHead = "检测结果数据表({0}).xlsx";
string pathNameEnd = ".CheckResultData.xlsx";
string fullPath = crControl.ExportExcel(pathDialog.SelectedPath, pathNameHead, pathNameEnd, ProductInfolist);
if (!string.IsNullOrEmpty(fullPath))
{
if (MessageHelper.ConfirmYesNo("报表导出成功!是否立即打开导出后的Excel文件?"))
{
try
{
var res = System.Diagnostics.Process.Start(fullPath);
}
catch (Exception ex)
{
MessageHelper.ShowError("Excel文件打开失败,请检查本机是否正确安装了Office软件!");
}
}
}
else
{
MessageHelper.ShowTips("报表导出失败,具体错误信息请查看日志记录!");
}
}
说明
ProductInfolist为要导出的界面报表数据list
pathNameHead为导出的excel的文件名
pathNameEnd为导出数据excel模板的文件名
Controller层ExportExcel方法
public string ExportExcel(string path, string pathNameHead, string pathNameEnd, List<ProductionChcekInfoBean> miis)
{
try
{
// 生成路径
path = Path.Combine(path, string.Format(pathNameHead, DateTime.Now.ToString("yyyy-MM-dd")));
// 取模板,插入数据,写盘
Type type = MethodBase.GetCurrentMethod().DeclaringType;
string nameSpace = type.Namespace;
Assembly ass = Assembly.GetExecutingAssembly();
using (Stream stream = ass.GetManifestResourceStream(nameSpace + pathNameEnd))
using (FileStream fs = File.OpenWrite(path))
{
var workbook = new XSSFWorkbook(stream);
InitXlsxData(workbook, miis);
workbook.Write(fs);
}
return path;
}
catch (Exception ex)
{
CascLog mesLog = mesLog = new CascLog(GetType().Name);
mesLog.Error("ExportExcel()", "报表导出失败,错误信息:" + ex.Message);
return "";
}
}
private void InitXlsxData(XSSFWorkbook workbook, List<ProductionChcekInfoBean> miis)
{
ISheet sheet = workbook.GetSheetAt(0);
int rowIndex = 1;
foreach (var mo in miis)
{
IRow rowTable = sheet.CreateRow(rowIndex);
rowTable.CreateCell(0).SetCellValue(mo.ID);
rowTable.CreateCell(1).SetCellValue(mo.StationNum);
rowTable.CreateCell(2).SetCellValue(mo.TrackNum);
rowTable.CreateCell(3).SetCellValue(mo.Step_Content);
rowTable.CreateCell(4).SetCellValue(mo.Check_Items);
rowTable.CreateCell(5).SetCellValue(mo.CheckResult);
rowTable.CreateCell(6).SetCellValue(mo.OperationMan);
rowTable.CreateCell(7).SetCellValue(mo.CheckMan);
rowTable.CreateCell(8).SetCellValue(mo.CreateTime);
IDataFormat dataformat = workbook.CreateDataFormat();
ICellStyle style0 = workbook.CreateCellStyle();
style0.DataFormat = dataformat.GetFormat("yyyy/MM/dd h:mm");
rowTable.GetCell(8).CellStyle = style0;
rowIndex++;
}
}
注意事项
- 导入excel模板后需要设置模板文件属性如下:
Stream stream = ass.GetManifestResourceStream(nameSpace + pathNameEnd)
括号中nameSpace + pathNameEnd是excel模板文件的完整路径,nameSpace获取到的一般是当前controller类的名称,所以excel模板要放在当前core层或者core文件夹下,否则会提示模板路径无法找到rowIndex
是标识从excel模板的第几行开始写入数据(从0开始数)此功能需要引用的dll有如下几个,缺一不可
引用dll
在代码中系统一般会提示导入NPOI相关的dll,但是第一个ICSharpCode.SharpZipLib可能需要手动导入,方便起见可以将这些dll提前放在CommonLibrary文件夹下,然后统一导入项目中