@sqliteman
Гейм-дизайнер

Как заполнить документ excel средствами c#?

В гугле лазил и ничего не понял + большая часть на ворд отсылает + примеры которые находил, при заполнении выдают ошибку.
В общем вся суть такова: мне необходимо заполнить пару строк текстом, затем ниже вывести таблицу, затем пару строк текста и на печать отправить (все это в бесшумном режиме).
Как создать документ я разобрался. Но как правильно его заполнять - не могу найти нигде инфу. Использую это - Microsoft.Office.Interop.Excel.
Собственно как это можно сделать? мсдн тоже листал - не нашел ничего внятного.
Мне бы просто пример как заполнить указанную ячейку указанной строки. Ну и если можно, как это на печать отправить сразу.
Находил пример где прописывали сразу конкретную ячейку и какое ей значение дать:
ячейка[1,1] = "text";
Но после него программа вылетает с необрабатываемым исключением.
  • Вопрос задан
  • 7526 просмотров
Пригласить эксперта
Ответы на вопрос 6
@VanKrock
Я использовал у себя SpreadsheetLight
Устанавливается через Nuget, есть ньюанс, о котором хоть и написано написано в описании пакета, но я как-то упустил и долго мучался, требует установки (тоже через Nuget) OpenXml причем версии 2.0 (не 2.5) поэтому при установке OpenXml в Nuget выберите версию пакета 1.0 тогда установится OpenXml 2.0.
Ответ написан
k1lex
@k1lex
Программист торг. сети. C# (WPF, WinForms), T-SQL
Если используете Microsoft.Office.Interop.Excel то что бы не было тормозов при заполнении передавайте данные сразу диапазоном. Вот один из моих методов, которыми пользуюсь.

void ToExcel(DataTable dt1)
        {
            try
            {
                Excel.Application EoXL;
                Excel._Workbook EoWB;
                Excel._Worksheet EoSheet;
                Excel.Range excelRange;
                EoXL = new Excel.Application();
                EoXL.Visible = false;
                EoWB = EoXL.Workbooks.Add(Type.Missing);

                int TabRows = 1;

                EoSheet = (Excel.Worksheet)EoWB.Worksheets.get_Item(1);//ссылка на лист excel
                EoSheet.Name = "Отчет о кодах возвратных накладных";
                EoSheet.PageSetup.Orientation = Excel.XlPageOrientation.xlLandscape;

                int row = dt1.Rows.Count;
                int col = dt1.Columns.Count;


                EoSheet.Cells[1, 1] = "Префиксы возвратных накладных и счетов фактур подразделений";
                EoSheet.Cells[1, 1].VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
                EoSheet.Cells[1, 1].Font.Bold = true;
                EoSheet.Cells[1, 1].Font.Size = 16;

              

                // передаем первую таблицу, заполняем ее в памяти и передаем целиком
                object[,] dataExport = new object[row, col];

                for (int i = 0; i < row; i++)
                {
                    for (int j = 0; j < col; j++)
                    {
                        dataExport[i, j] = dt1.Rows[i][j];
                    }

                }


                excelRange = EoSheet.Range[EoSheet.Cells[2 + TabRows, 1], EoSheet.Cells[row + 1 + TabRows, col]];
                excelRange.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, dataExport);
                excelRange.Borders.ColorIndex = 0;

//этот кусок в качестве примера указания типа данных в ячейках
                // excelRange = EoSheet.Range[EoSheet.Cells[2 + TabRows, 8], EoSheet.Cells[row + 1 + TabRows, 10]];
                // excelRange.NumberFormat = "#,##0.00";

                // формируем заголовок
                ArrayList displayColumnExsel = new ArrayList();


                foreach (DataColumn c in dt1.Columns)
                {

                    displayColumnExsel.Add(c.ColumnName);
                }

                object[] dataExportH = new object[col];
                for (int i = 0; i < col; i++)
                    dataExportH[i] = displayColumnExsel[i];

                excelRange = EoSheet.Range[EoSheet.Cells[1 + TabRows, 1], EoSheet.Cells[1 + TabRows, col]];
                excelRange.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, dataExportH);
                excelRange.Font.Bold = true;
                excelRange.WrapText = true;
                excelRange.Borders.ColorIndex = 0;
                excelRange.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
                excelRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                      

               EoXL.Visible = true;
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message, "Ошибка метода переноса таблиц", MessageBoxButton.OK, MessageBoxImage.Error);
            }


        }
Ответ написан
@dmitryKovalskiy
программист средней руки
Недавно использовал вот такую sourceforge.net/projects/jexcelapi/files/CSharpJExcel либу. Конкретную задачу решила.
Ответ написан
Комментировать
@sqliteman Автор вопроса
Гейм-дизайнер
Как писать в ячейки разобрался (осталось научиться форматированию и добавлению таблиц)
Вот код:
Excel.Worksheet ObjWorkSheet;
            Excel.Workbook ObjWorkBook;
            Excel.Application ObjExcel = new Excel.Application();
            ObjWorkBook = ObjExcel.Workbooks.Add(System.Reflection.Missing.Value);
            ObjWorkSheet = (Excel.Worksheet)ObjWorkBook.Sheets[1];
            ObjWorkSheet.Cells[1, 1] = "фывв";
            ObjWorkSheet.Cells[1, 2] = "фыв";
            ObjExcel.Visible = true;
            ObjExcel.UserControl = true;

Осталось еще понять как на печать отправить
Ответ написан
Комментировать
pahanbi4
@pahanbi4
программер
Через "это" Microsoft.Office.Interop.Excel документы формируются довольно долго (если они объемные), лучше использовать OpenXml правда разобраться в нем довольно тяжело, поэтому в большинстве случаев для Word использую DocX для Excel ClosedXml. Установить можно через Nuget.
Ответ написан
Shwed_Berlin
@Shwed_Berlin
.net Software Developer
Позвольте спросить - а зачем именнпо Эксель? Вам только распечатать нужно или сам файл тоже сохранить?
1. Если формат не принципиален (.xlsx) и важно открытие в программе Эксель то можно писать текстовый файл в формате .csv или .html - Эксель сможет их открыть и правильно отобразить. По поводу печати из c# таких файлов не знаю.
2. Если же вам просто нужно распечатать в удобо-приятном виде документ с таблицей и у вас есть DataSet - то можно сделать это с помощью ReportingServices. Тема с нуля не самая легкая, но оформление документов и их печать там более легкие/функциональные - например можно и диаграммы/графики запилить, и сохранить в PDF.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы