2017-10-04 7 views
0

J'ai un modèle Excel dans lequel le format de l'en-tête de table, de la section de données et du pied de tableau est spécifié. Ces sections peuvent contenir des images, des cellules fusionnées, etc. Les cellules dont les données doivent être mappées sont des cellules nommées. J'ai essayé d'utiliser la bibliothèque EPPlus pour générer le rapport basé sur le modèle Excel. Je utilisé l'extrait ci-dessous pour copier la plage de cellulesCréation d'un rapport Excel basé sur le modèle

var worksheet = destExcelPackage.Workbook.Worksheets.Add("Sheet 1"); 
var sourceRange = sourceExcelPackage.Workbook.Worksheets.First().Cells["B6:P11"]; 
sourceRange.Copy(worksheet.Cells["A1"]); 

Mais cela ne rendait pas la largeur des colonnes égale à la source. Je devais définir la largeur de colonne à la largeur de la source comme

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; 
} 

J'ai les questions suivantes:


  1. Y at-il une meilleure façon de régler la largeur de colonne égale à la source?
  2. Les cellules copiées contenaient une image, mais la nouvelle feuille n'était pas copiée. Comment copier l'image?
  3. Comment identifier les cellules nommées dans la feuille Excel afin que je puisse définir la valeur de la cellule à partir de certaines sources de données?

Répondre

0

J'ai trouvé un moyen d'atteindre les points 2 et 3 ci-dessus. Il semble que si l'image est nommée, il est facile de la lire. Donc, pour # 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; 
    } 

Et pour # 3

var cell = sourceExcelPackage.Workbook.Names?.Where(item => item.Name==headerName).FirstOrDefault(); 

renverra la cellule qui est désignée comme headerName.