在创建新的Excel文件时,我需要向工作表中添加具有特定宽度的列。根据我发现的所有地方,这必须在Sheetdata (one link here)之前完成。但是我尝试了很多事情,但是无法正常工作。我用于创建Excel文件的代码来自官方网站(link here - It's meant for ASP.NET but works fine for me)。
这是我的代码,也是让它正常工作的最后尝试:
public void Export_Datagridview(DataGridView dgv, string filename)
{
using (var workbook = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
{
var workbookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new Workbook();
workbook.WorkbookPart.Workbook.Sheets = new Sheets();
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
//this part is giving me "object reference" error
sheetPart.Worksheet.InsertBefore(AutoFit_Columns(dgv, sheetPart.Worksheet), sheetData);
...//and so on...
添加列的代码:
private Columns AutoFit_Columns(DataGridView dgv, Worksheet worksheet)
{
Columns cols = new Columns();
for (int col = 0; col < dgv.ColumnCount; colc++)
{
double max_width = 14.5; //something like default width in Excel
for (int row = 0; row < dgv.RowCount; row++)
{
double cell_width = Text_width(dgv.Rows[row].Cells[col].Value.ToString(), new System.Drawing.Font("Arial", 12.0F));
if (cell_width > max_width)
{
max_width = cell_width;
}
if (row == dgv.RowCount - 1) //last iteration - here we allready have max width within column
{
Column c = new Column() { Min = Convert.ToUInt32(col), Max = Convert.ToUInt32(col), Width = max_width, CustomWidth = true };
cols.Append(c);
worksheet.Append(cols);
}
}
}
return cols;
}
如您所见,这是我尝试根据从Datagridview导出的数据自动调整列。但是在测试其他代码之前,我需要正确添加列。任何帮助表示感谢!
答案 0 :(得分:1)
想通了,要解决和发现所有问题并不是那么容易。首先,我需要将高级代码更改为此:
public void Export_Datagridview(DataGridView dgv, string filename)
{
using (var workbook = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
{
var workbookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new Workbook();
workbook.WorkbookPart.Workbook.Sheets = new Sheets();
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
//this part is new - I had to change method for autofit too
sheetPart.Worksheet = new Worksheet();
sheetPart.Worksheet.Append(AutoFit_Columns(dgv));
sheetPart.Worksheet.Append(sheetData);
...//and so on...
,然后更改自动调整方法。由于循环从0开始,并且没有索引为0的列,因此它仍然引起错误。将其更改为1:
for (int col = 1; col < dgv.ColumnCount; colc++)
{
Excel现在将打开,并设置了列宽,但是需要自动调整代码。如果有兴趣的人,here是我的完整解决方案,其中包括自动调整功能。