VSTO 系列(05)- 使用模板导入数据

在本系列的第二篇,实现了从数据库导入数据。对导入数据的工作表,如果有格式要求,可以通过代码来设置,但更方便的方式是使用数据模板。本篇介绍如何使用 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);
}

源代码

05-Importing Data from Template · - 码云

猜你喜欢

转载自blog.csdn.net/stone0823/article/details/115097774