2017-10-04 111 views
0

我有一個Excel模板,其中指定了表格標題,數據段和表格頁腳的格式。這些部分可能包含圖像,合併的單元格等。 數據需要映射的單元格是命名單元格。 我嘗試使用EPPlus庫來生成基於Excel模板的報告。 我用下面的代碼片段複製細胞基於模板創建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; 
} 

我有以下問題:


  1. 有沒有更好的方式來設置列寬等於源?
  2. 複製的單元格有一個圖像,但它沒有複製到新的圖紙。如何獲取圖像複製?
  3. 如何識別Excel工作表中的命名單元格,以便我可以從某些數據源中爲單元格設置值?

回答

0

我找到了一種方法來實現上述第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(); 

將返回其命名爲headerName細胞。