2013-09-03 21 views
12

Bir sütunun WrapText = true değerini ayarladıktan sonra, satırın yeni yüksekliğinin ne olacağını görmek istiyorum (yani metin sardığında, kaç satır için). Bir satırın Yükseklik özelliğinin güncellenmediği anlaşılıyor.epplus: Sütun wraptext stilini true değerine ayarladıktan sonra bir satırın yüksekliğini nasıl alabilirim?

 ExcelPackage pkg = new ExcelPackage(); 
     ExcelWorksheet sheet = pkg.Workbook.Worksheets.Add("Test"); 

     // height is 15.0 
     double heightBefore = sheet.Row(1).Height; 


     sheet.Cells[1, 1].Value = "Now is the time for all good men to come to the aid of their country"; 

     ExcelColumn col = sheet.Column(1); 

     // this will resize the width to 60 
     col.AutoFit(); 

     if (col.Width > 50) 
     { 
      col.Width = 50; 

      // this is just a style property, and doesn't actually execute any recalculations 
      col.Style.WrapText = true; 
     } 

     // so this is still 15.0. How do I get it to compute what the size will be? 
     double heightAfter = sheet.Row(1).Height; 

     // open the xls, and the height is 30.0 
     pkg.SaveAs(new System.IO.FileInfo("text.xlsx")); 

Aslında, Yükseklik özelliği (veya altta yatan alan _height) için bir arama sadece mülkiyet setter tarafından ayarlandığını gösterir ve hiç içerik gibi (başka bir şey temel alınarak belirlenecektir görünmüyor Sıra).

Bir satır için yenilenmiş bir Yüksekliğe nasıl ulaşabileceğimiz hakkında herhangi bir fikir var mı?

Teşekkür

cevap

6

Ben EPPlus ile fark ettik genel desen gerekli bilgilerin minimum miktarda dokümanın çerçevesini oluşturur olmasıdır. Ardından, dosyayı açtığınızda, Excel kalan XML yapısını doldurur, bu nedenle EPPlus tarafından oluşturulan bir belgeyi açtıktan sonra dosyayı her zaman kaydetmeniz gerekir.

Sorunuz için, Excel dosyasını açtıktan sonra Excel'in satır yükseklikleri güncellendiğini varsayıyorum, böylece EPPlus güncellenmiş satır yüksekliği bilgisine sahip olmayacaktı. Kütüphanenin bunu desteklemediğinden kesinlikle emin değilim, ama sizin gibi güncellenmiş değerleri elde etmenin bir yolunu bulamadım.

private int GetLineCount(String text, int columnWidth) 
{ 
    var lineCount = 1; 
    var textPosition = 0; 

    while (textPosition <= text.Length) 
    { 
     textPosition = Math.Min(textPosition + columnWidth, text.Length); 
     if (textPosition == text.Length) 
      break; 

     if (text[textPosition - 1] == ' ' || text[textPosition] == ' ') 
     { 
      lineCount++; 
      textPosition++; 
     } 
     else 
     { 
      textPosition = text.LastIndexOf(' ', textPosition) + 1; 

      var nextSpaceIndex = text.IndexOf(' ', textPosition); 
      if (nextSpaceIndex - textPosition >= columnWidth) 
      { 
       lineCount += (nextSpaceIndex - textPosition)/columnWidth; 
       textPosition = textPosition + columnWidth; 
      } 
      else 
       lineCount++; 
     } 
    } 

    return lineCount; 
} 
:

ExcelPackage pkg = new ExcelPackage(); 
ExcelWorksheet sheet = pkg.Workbook.Worksheets.Add("Test"); 

// height is 15.0 
double heightBefore = sheet.Row(1).Height; 

var someText = "Now is the time for all good men to come to the aid of their country. Typewriters were once ground-breaking machines."; 
sheet.Cells[1, 1].Value = someText; 

ExcelColumn col = sheet.Column(1); 
ExcelRow row = sheet.Row(1); 

// this will resize the width to 60 
col.AutoFit(); 

if (col.Width > 50) 
{ 
    col.Width = 50; 

    // this is just a style property, and doesn't actually execute any recalculations 
    col.Style.WrapText = true; 
} 

// calculate the approximate row height and set the value; 
var lineCount = GetLineCount(someText, (int)col.Width); 
row.Height = heightBefore * lineCount; 

// open the xls, and the height is 45.0 
pkg.SaveAs(new System.IO.FileInfo("text.xlsx")); 

İşte satır sayısını hesaplamak için bir yöntem vardır:

Bir geçici çözüm ancak sadece metin uzunluğu ve sütun genişliğini biliyorum çünkü değer ne olacağını hesaplamak için olabilir

Unutulmaması gereken bir nokta, Excel'in maksimum satır yüksekliği 409.5 olmasıdır. Bu nedenle, sütun genişliğinizin bu sınıra ulaşacağınız kadar dar olmadığından emin olmak istersiniz.

Ayrıca, fark ettiğim başka bir şey de EPPlus ile manuel olarak ayarladığınız sütun genişliklerinin sütunları beklenen değere ayarlamamasıdır. Örneğin, sütun genişliğinizi 50 olarak ayarlarsanız, gerçek sütun genişliğinin 49,29 olarak ayarlandığını fark edersiniz, böylece bunu da hesaba katmak isteyebilirsiniz.

+0

Neredeyse burada cevabınız var. Karşılaşacağınız problem, bir alandaki (veya kısa çizgi vb.) Satırları kesmeyi seçerek Excel ile ilgili olmalıdır. Tam olarak 50 karakterden ayrılmayacağından, sonunda fazladan bir satır olabilir (yukarıdaki örnekte 50 yerine 16'yı seçin). Eğer zamanım varsa, bunu yapmak için bir rutin çalışacağım, ama basit olmayabilir. – user1689571

+0

Ahh, evet haklısın, üzgünüm, bunu çok özledim. Ne bulabileceğimi göreceğim ama evet, muhtemelen güzel olmayacak. – Chris

+0

Soo, söylediğin gibi, Excel'in sarılı metninizle ne yapacağını anlamaya çalışmak doğru değil. Ama düşünüyordum da, hesaplanan değere gerçekten yaklaşabilir ve satır yüksekliğini manuel olarak ayarlayabilirseniz? Bu şekilde, değerin ne olacağını kontrol edersiniz. Cevabı şimdi olası bir çözümle güncelliyorum. – Chris

İlgili konular