基于模板创建 Excel 报告
Creating an Excel report based on template
我有一个 Excel 模板,其中指定了 table header、数据部分和 table 页脚的格式。这些部分可能有图像、合并的单元格等。
需要映射数据的单元格称为单元格。
我尝试使用 EPPlus 库生成基于 Excel 模板的报告。
我使用以下代码片段复制单元格范围
var worksheet = destExcelPackage.Workbook.Worksheets.Add("Sheet 1");
var sourceRange = sourceExcelPackage.Workbook.Worksheets.First().Cells["B6:P11"];
sourceRange.Copy(worksheet.Cells["A1"]);
但这并没有使列宽等于源。我必须将列宽设置为源宽度
var startCol = sourceRange.Start.Column;
var endCol = sourceRange.End.Column;
for (int j = startCol, destCol = 1; j <= endCol; j++, destCol++)
{
worksheet.Column(destCol).Width = sourceExcelPackage.Workbook.Worksheets.First().Column(j).Width;
}
我有以下问题:
- 有没有更好的方法设置列宽等于源?
- 复制的单元格有图像,但没有复制到新单元格 sheet。如何复制图片?
- 如何识别 Excel sheet 中的命名单元格,以便我可以从某些数据源为单元格设置值?
我找到了实现上述第 2 点和第 3 点的方法。
看来如果给图片命名,就很容易阅读了。
所以对于#2
private static void CopyImage(ExcelPackage sourceExcelPackage, ExcelWorksheet destWorksheet)
{
var image = GetImage("Pic01", sourceExcelPackage);
ExcelPicture pic = destWorksheet.Drawings.AddPicture("Pic01", image.Image);
pic.From.Column = image.From.Column;
pic.From.Row = image.From.Row;
pic.To.Column = image.To.Column;
pic.To.Row = image.To.Row;
var destRow = 1;
var destCol = 1;
pic.SetPosition(destRow, Pixel2MTU(image.From.RowOff), destCol, Pixel2MTU(image.From.ColumnOff));
pic.EditAs = eEditAs.TwoCell;
pic.AdjustPositionAndSize();
}
private static ExcelPicture GetImage(string pictureName, ExcelPackage excelFile)
{
var sheet = excelFile.Workbook.Worksheets.First();
var pic = sheet.Drawings[pictureName] as ExcelPicture;
return pic;
}
private static int Pixel2MTU(int fromRowOff)
{
return fromRowOff / ExcelDrawing.EMU_PER_PIXEL;
}
#3
var cell = sourceExcelPackage.Workbook.Names?.Where(item => item.Name==headerName).FirstOrDefault();
将return单元格命名为headerName。
我有一个 Excel 模板,其中指定了 table header、数据部分和 table 页脚的格式。这些部分可能有图像、合并的单元格等。 需要映射数据的单元格称为单元格。 我尝试使用 EPPlus 库生成基于 Excel 模板的报告。 我使用以下代码片段复制单元格范围
var worksheet = destExcelPackage.Workbook.Worksheets.Add("Sheet 1");
var sourceRange = sourceExcelPackage.Workbook.Worksheets.First().Cells["B6:P11"];
sourceRange.Copy(worksheet.Cells["A1"]);
但这并没有使列宽等于源。我必须将列宽设置为源宽度
var startCol = sourceRange.Start.Column;
var endCol = sourceRange.End.Column;
for (int j = startCol, destCol = 1; j <= endCol; j++, destCol++)
{
worksheet.Column(destCol).Width = sourceExcelPackage.Workbook.Worksheets.First().Column(j).Width;
}
我有以下问题:
- 有没有更好的方法设置列宽等于源?
- 复制的单元格有图像,但没有复制到新单元格 sheet。如何复制图片?
- 如何识别 Excel sheet 中的命名单元格,以便我可以从某些数据源为单元格设置值?
我找到了实现上述第 2 点和第 3 点的方法。 看来如果给图片命名,就很容易阅读了。 所以对于#2
private static void CopyImage(ExcelPackage sourceExcelPackage, ExcelWorksheet destWorksheet)
{
var image = GetImage("Pic01", sourceExcelPackage);
ExcelPicture pic = destWorksheet.Drawings.AddPicture("Pic01", image.Image);
pic.From.Column = image.From.Column;
pic.From.Row = image.From.Row;
pic.To.Column = image.To.Column;
pic.To.Row = image.To.Row;
var destRow = 1;
var destCol = 1;
pic.SetPosition(destRow, Pixel2MTU(image.From.RowOff), destCol, Pixel2MTU(image.From.ColumnOff));
pic.EditAs = eEditAs.TwoCell;
pic.AdjustPositionAndSize();
}
private static ExcelPicture GetImage(string pictureName, ExcelPackage excelFile)
{
var sheet = excelFile.Workbook.Worksheets.First();
var pic = sheet.Drawings[pictureName] as ExcelPicture;
return pic;
}
private static int Pixel2MTU(int fromRowOff)
{
return fromRowOff / ExcelDrawing.EMU_PER_PIXEL;
}
#3
var cell = sourceExcelPackage.Workbook.Names?.Where(item => item.Name==headerName).FirstOrDefault();
将return单元格命名为headerName。