您好我有这个代码,我创建一个xlsx文件,我需要预先设置xlsx表单元格的宽度。 实际问题是,当我打开excell时,我需要用鼠标双击列之间的间隙,以打开列并重新隐藏隐藏的数据。 有没有办法用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);
答案 0 :(得分:126)
我发现在填写完工作表上的所有数据后设置列宽:
ws.Column(1).Width = 50;
还有autoFitColumns方法,但这会忽略包含公式和包装文本的单元格,因此它对我不起作用。
ws.Cells["A1:K20"].AutoFitColumns();
答案 1 :(得分:22)
实际答案已标记为设置列宽的正确方法,但有一个问题是在Excel中第一次打开文档时,它会重新计算列的宽度(不知道原因),正如我在下面的评论中提到的那样当我将列宽设置为7.86时,它会将其重置为7.14和10.43到9.7x。
我找到了来自this epp reported issue的以下代码,以根据需要获得壁橱可能的列宽。
//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;
}
答案 2 :(得分:6)
Mubashar Ahmad的回答对我有所帮助,谢谢你。我想包括我在项目中如何使用它。我把它变成了一个扩展方法并重构了它。
这是实现,它设置工作表中第一列的单元格宽度。
worksheet.Column(1).SetTrueColumnWidth(28);
以下是在EPPlus Excel文件中设置更准确的列宽的扩展方法,请注意此方法必须位于静态类中:
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;
}
答案 3 :(得分:2)
您只需更改其 DefaultColWidth 属性即可更改工作表中所有列的默认宽度:
worksheet.DefaultColWidth = 25;
答案 4 :(得分:0)
有一种更简单的方法。 Excel将量化传入的列宽,以显示低于1的12th到高于1的7th。这意味着阶梯结果,并且无法得出许多最终值(例如3.5、4.5等)。
要预先补偿宽度,以下内容就足够了。
IF DesiredWidth <1然后
AdjustedWidth = 12/7 * DesiredWidth
ELSE
AdjustedWidth = DesiredWidth + 5/7
ENDIF
编写Worksheet.Column(i).Width =使用EPPLUS调整宽度
这是单调调整,Excel将对打开/保存进行所有量化。