Witam Mam ten kod, w którym tworzę plik xlsx i muszę wstępnie ustawić szerokość komórek arkusza xlsx. Rzeczywisty problem polega na tym, że kiedy otwieram program Excel, muszę dwukrotnie kliknąć lukę między kolumnami za pomocą myszy, aby rozpakować kolumny i sprawdzić ukryte dane. Czy istnieje sposób, aby zrobić to programowo w Epplus?
using (ExcelPackage p = new ExcelPackage())
{
String filepath = "C://StatsYellowPages.csv";
DataSet ds = ExportCSVFileToDataset(filepath, "tblCustomers", "\t");
//Here setting some document properties
p.Workbook.Properties.Title = "StatsYellowPages";
//Create a sheet
p.Workbook.Worksheets.Add("Sample WorkSheet");
ExcelWorksheet ws = p.Workbook.Worksheets[1];
ws.Name = "StatsYellowPages"; //Setting Sheet's name
//Merging cells and create a center heading for out table
ws.Cells[1, 1].Value = "StatsYellowPages";
ws.Cells[1, 1, 1, ds.Tables[0].Columns.Count].Merge = true;
ws.Cells[1, 1, 1, ds.Tables[0].Columns.Count].Style.Font.Bold = true;
ws.Cells[1, 1, 1, ds.Tables[0].Columns.Count].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
int colIndex = 1;
int rowIndex = 2;
foreach (DataColumn dc in ds.Tables[0].Columns) //Creating Headings
{
var cell = ws.Cells[rowIndex, colIndex];
//Setting the background color of header cells to Gray
var fill = cell.Style.Fill;
fill.PatternType = ExcelFillStyle.Solid;
fill.BackgroundColor.SetColor(Color.Gray);
//Setting Top/left,right/bottom borders.
var border = cell.Style.Border;
border.Bottom.Style = ExcelBorderStyle.Thin;
border.Top.Style = ExcelBorderStyle.Thin;
border.Left.Style = ExcelBorderStyle.Thin;
border.Right.Style = ExcelBorderStyle.Thin;
//Setting Heading Value in cell
cell.Value = dc.ColumnName;
colIndex++;
}
foreach (DataRow dr in ds.Tables[0].Rows) // Adding Data into rows
{
colIndex = 1;
rowIndex++;
foreach (DataColumn dc in ds.Tables[0].Columns)
{
var cell = ws.Cells[rowIndex, colIndex];
//Setting Value in cell
cell.Value = dr[dc.ColumnName].ToString();
//Setting borders of cell
var border = cell.Style.Border;
colIndex++;
}
}
//Generate A File with Random name
Byte[] bin = p.GetAsByteArray();
string file = "c:\\StatsYellowPages.xlsx";
File.WriteAllBytes(file, bin);
for (i = 1; i <= ws.Dimension.End.Column; i++) { ws.Column(i).AutoFit(); }
Rzeczywista odpowiedź jest już zaznaczona, że jest to właściwy sposób ustawienia szerokości kolumny, ale jest jeden problem, że gdy dokument jest otwierany po raz pierwszy w programie Excel, przelicza szerokość kolumn (nie wiem dlaczego), tak jak wspomniałem w komentarzu pod zaznaczoną odpowiedzią, kiedy ustawiam szerokość kolumny na 7,86, resetuje ją na 7,14 i 10,43 na 9,7x.
Znalazłem następujący kod z tego zgłoszonego problemu przez EPP, aby uzyskać dowolną możliwą szerokość kolumny.
//get 7.14 in excel ws.Column(1).Width = 7.86; //get 7.86 in excel ws.Column(1).Width = GetTrueColumnWidth(7.86); public static double GetTrueColumnWidth(double width) { //DEDUCE WHAT THE COLUMN WIDTH WOULD REALLY GET SET TO double z = 1d; if (width >= (1 + 2 / 3)) { z = Math.Round((Math.Round(7 * (width - 1 / 256), 0) - 5) / 7, 2); } else { z = Math.Round((Math.Round(12 * (width - 1 / 256), 0) - Math.Round(5 * width, 0)) / 12, 2); } //HOW FAR OFF? (WILL BE LESS THAN 1) double errorAmt = width - z; //CALCULATE WHAT AMOUNT TO TACK ONTO THE ORIGINAL AMOUNT TO RESULT IN THE CLOSEST POSSIBLE SETTING double adj = 0d; if (width >= (1 + 2 / 3)) { adj = (Math.Round(7 * errorAmt - 7 / 256, 0)) / 7; } else { adj = ((Math.Round(12 * errorAmt - 12 / 256, 0)) / 12) + (2 / 12); } //RETURN A SCALED-VALUE THAT SHOULD RESULT IN THE NEAREST POSSIBLE VALUE TO THE TRUE DESIRED SETTING if (z > 0) { return width + adj; } return 0d; }
źródło
Odpowiedź Mubashara Ahmada pomogła mi, dziękuję za to. Chciałem zawrzeć, jak go wykorzystałem w swoim projekcie. Zrobiłem z tego metodę rozszerzającą i ponownie ją przerobiłem.
Oto implementacja, która ustawia szerokość komórki dla pierwszej kolumny w arkuszu.
worksheet.Column(1).SetTrueColumnWidth(28);
Oto metoda rozszerzenia służąca do ustawiania dokładniejszej szerokości kolumny w plikach EPPlus Excel, zwróć uwagę, że ta metoda musi znajdować się wewnątrz klasy statycznej:
public static void SetTrueColumnWidth(this ExcelColumn column, double width) { // Deduce what the column width would really get set to. var z = width >= (1 + 2 / 3) ? Math.Round((Math.Round(7 * (width - 1 / 256), 0) - 5) / 7, 2) : Math.Round((Math.Round(12 * (width - 1 / 256), 0) - Math.Round(5 * width, 0)) / 12, 2); // How far off? (will be less than 1) var errorAmt = width - z; // Calculate what amount to tack onto the original amount to result in the closest possible setting. var adj = width >= 1 + 2 / 3 ? Math.Round(7 * errorAmt - 7 / 256, 0) / 7 : Math.Round(12 * errorAmt - 12 / 256, 0) / 12 + (2 / 12); // Set width to a scaled-value that should result in the nearest possible value to the true desired setting. if (z > 0) { column.Width = width + adj; return; } column.Width = 0d; }
źródło
Możesz zmienić domyślną szerokość wszystkich kolumn w arkuszu, po prostu zmieniając jego właściwość DefaultColWidth :
worksheet.DefaultColWidth = 25;
źródło
Jest łatwiejszy sposób. Excel będzie kwantyzować przekazane szerokości kolumn, aby wyświetlić 12. poniżej 1 i 7. powyżej. Oznacza to, że rezultatem są schody i nie można określić wielu wartości końcowych (np. 3,5, 4,5 itd.).
Aby wyrównać wstępnie szerokość, wystarczy wykonać poniższe czynności.
JEŚLI DesiredWidth <1 wtedy
AdjustedWidth = 12/7 * DesiredWidth
JESZCZE
AdjustedWidth = DesiredWidth + 5/7
ENDIF
Napisz Worksheet.Column (i) .Width = AdjustedWidth z EPPLUS
Jest to regulacja monotoniczna, a program Excel wykonuje całą kwantyzację przy otwieraniu / zapisywaniu.
źródło