Добавить столбцы перед Sheetdata - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно добавить столбцы с определенной шириной на лист при создании нового файла Excel. Везде, где я смотрел, это должно быть сделано до Sheetdata (одна ссылка здесь) . Однако я пробовал множество вещей, но не могу заставить его работать. Мой код для создания файла Excel с официального сайта (ссылка здесь - он предназначен для ASP.NET, но отлично работает для меня) .

Вот мой код и последняя попытка заставить его работать:

 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 Ответ

1 голос
/ 12 апреля 2019

Разобрался, было не так легко решить и выявить все проблемы. Сначала мне нужно было изменить верхний код на это:

 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...

, а затем измените метод Autofit. Это все еще вызывало ошибки, потому что цикл начался с 0, и нет столбца с индексом 0. Изменил его на 1:

 for (int col = 1; col < dgv.ColumnCount; colc++)
            {

Excel теперь открывается с установленной шириной столбцов, хотя для автоподбора необходим корректировочный код. Если кому-то интересно, здесь - это мое полное решение с включенным автофитом.

...