在本系列的第二篇,实现了从数据库导入数据。对导入数据的工作表,如果有格式要求,可以通过代码来设置,但更方便的方式是使用数据模板。本篇介绍如何使用 Excel 模板来导入数据。
假设我们要从数据库中导入 employees 表的数据,提前准备好 Excel 模板,将模板文件放在 bin/debug/templates 文件夹下。
在 ExcelUtils.cs 文件中,添加一个静态方法 CopyWorkSheetTempate ,用于从模板文件中拷贝模板工作表:
public static void CopyWorksheetTemplate(String templateWorkbookFile, String sourceSheetName, Worksheet targetSheet) {
Application excelApp = ThisAddIn.ExcelApp;
excelApp.ScreenUpdating = false;
Workbook templateWorkbook = excelApp.Workbooks.Open(templateWorkbookFile);
if (templateWorkbook == null) {
throw new Exception("Template file does not exist.");
}
Worksheet templateSheet = templateWorkbook.Worksheets[sourceSheetName];
if (templateSheet == null) {
throw new Exception("Template worksheet does not exist.");
}
templateSheet.Copy(targetSheet);
templateWorkbook.Close();
excelApp.ScreenUpdating = true;
}
在 Ribbon 功能区中,创建一个按钮,Label 属性设置为"查看Employee表数据",在 button_click 事件中编写如下代码:
private void btnImportEmployees_Click(object sender, RibbonControlEventArgs e) {
Worksheet targetSheet = ThisAddIn.ExcelApp.ActiveSheet;
// copy worksheet from template file
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
string templateFile = $@"{baseDir}templates\emp_master_template.xlsx";
if (File.Exists(templateFile)) {
ExcelUtils.CopyWorksheetTemplate(templateFile, "emp_master", targetSheet);
targetSheet = ThisAddIn.ExcelApp.Worksheets[1]; // 拷贝后,新的工作表位于最开始位置
}
else {
// if template file does not exist, add a new worksheet
targetSheet = ThisAddIn.ExcelApp.Worksheets.Add();
}
// copy data
System.Data.DataTable values = EmployeeService.ListAll();
ExcelUtils.CopyFromDataTable(values, targetSheet);
}