在Sheetdata之前附加列

时间:2019-04-12 06:35:13

标签: c# openxml

在创建新的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导出的数据自动调整列。但是在测试其他代码之前,我需要正确添加列。任何帮助表示感谢!

1 个答案:

答案 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是我的完整解决方案,其中包括自动调整功能。