Я пытаюсь использовать Open XML для создания файла, но при попытке добавить только первую строку заголовков файл поврежден, и я не могу открыть, может ли кто-нибудь сказать мне, что я делаю здесь не так?
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create ("C: \ testpdfs \ mytest.xlsx", SpreadsheetDocumentType.Workbook)) {//Добавляем WorkbookPart в документ . WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart (); workbookpart.Workbook = новая книга (); //Добавляем WorksheetPart в WorkbookPart. WorksheetPart workheetPart = workbookpart.AddNewPart (); worksheetPart.Worksheet = новый рабочий лист (новые SheetData ()); //Добавить листы в рабочую книгу. Листы листов = spreadsheetDocument.WorkbookPart.Workbook. AppendChild (новые Таблицы ()); //Добавляем новый рабочий лист и связываем его с книгой. Лист листа = новый лист () {Id = spreadsheetDocument.WorkbookPart. GetIdOfPart (workheetPart), SheetId = 1, Name = ViewBag.Title}; Строка row = новая строка () {RowIndex = 1}; Ячейка header1 = новая ячейка () {CellReference = "A1", CellValue = new CellValue ("Временная метка периода интервала")}; row.Append (header1); Ячейка header2 = новая ячейка () {CellReference = "A2", CellValue = new CellValue ("Расчетный интервал")}; row.Append (header2); Ячейка header3 = новая ячейка () {CellReference = "A3", CellValue = new CellValue ("агрегированный коэффициент потребления")}; row.Append (header3); Ячейка header4 = новая ячейка () {CellReference = "A4", CellValue = new CellValue ("Агрегированное потребление с поправкой на потери")}; row.Append (header4); sheet.Append (строка); sheet.Append (лист); //sheet.Append(row); workbookpart.Workbook.Save (); //Закрываем документ. spreadsheetDocument.Close (); return View (); }
У вас есть несколько проблем.
Во-первых, вы добавляете строку
в Sheet
, но его нужно добавить в SheetData
. Самый простой способ сделать это — сохранить ссылку на объект SheetData
, чтобы мы могли использовать его позже:
SheetData sheetData = new SheetData (); worksheetPart.Worksheet = new Worksheet (sheetData); ... sheetData.Append (row);
Во-вторых, вам необходимо явно указать тип данных для каждой ячейки, потому что по умолчанию, если тип данных не указан, — число:
Cell header1 = new Cell () {CellReference = "A1", CellValue = new CellValue ("Временная метка периода интервала") , DataType = CellValues.String};
Наконец, ваши ссылки на ячейки не совсем правильные. Вы добавляете все в одну строку, но добавляете ссылки для строк с 1 по 4 (A1-A4). Учитывая, что в вашем коде ячейки называются «заголовками», я предполагаю, что вам действительно нужны значения в ячейках A1-D1, и в этом случае вам нужно просто обновить значения CellReference
.. Если вам действительно нужны значения в формате A1-A4, вам необходимо добавить каждую ячейку в новую строку.
Полный список кода (при условии, что вам нужны ячейки A1-D1):
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create ("C: \ testpdfs \ mytest.xlsx", SpreadsheetDocumentType.Workbook)) {//Добавляем WorkbookPart в документ. WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart (); workbookpart.Workbook = новая книга (); //Добавляем WorksheetPart в WorkbookPart. WorksheetPart workheetPart = workbookpart.AddNewPart (); SheetData sheetData = новый SheetData (); worksheetPart.Worksheet = новый рабочий лист (sheetData); //Добавить листы в рабочую книгу. Листы листов = spreadsheetDocument.WorkbookPart.Workbook. AppendChild (новые Таблицы ()); //Добавляем новый рабочий лист и связываем его с книгой. Лист листа = новый лист () {Id = spreadsheetDocument.WorkbookPart. GetIdOfPart (workheetPart), SheetId = 1, Name = ViewBag.Title}; Строка row = новая строка () {RowIndex = 1}; Ячейка header1 = новая ячейка () {CellReference = "A1", CellValue = new CellValue ("Временная метка периода интервала"), DataType = CellValues.String}; row.Append (header1); Ячейка header2 = новая ячейка () {CellReference = "B1", CellValue = новая ячейкаValue ("Расчетный интервал"), DataType = CellValues.String}; row.Append (header2); Ячейка header3 = новая ячейка () {CellReference = "C1", CellValue = new CellValue ("агрегированный коэффициент потребления"), DataType = CellValues.String}; row.Append (header3); Ячейка header4 = новая ячейка () {CellReference = "D1", CellValue = new CellValue ("агрегированное потребление с поправкой на потери"), DataType = CellValues.String}; row.Append (header4); sheetData.Append (строка); sheet.Append (лист); workbookpart.Workbook.Save (); //Закрываем документ. spreadsheetDocument.Close (); return View ();}
- OpenXml SDK (краткое руководство C #)
- КОНЦЕПЦИИ C #
- Программная работа с файлами Excel с использованием OpenXml SDK.
- В статьях показано, как программно работать с документом Excel в консольном приложении C #.
- Перечисление доступных типов документов в SDK:
- Примеры вызовов следующих функций
- Используется функция ниже для создания новой ячейки
- Примеры вызовов функций, указанных ниже
- Функция ниже используется для получения существующего значения ячейки
- GitHub Репо
- ssukhpinder/InteropExample
- Как создавать, изменять и удалять Excel операции с электронными таблицами — ssukhpinder/InteropExample
- github.com
- Заинтересованы в концепциях C # 8.0, вот некоторые ссылки
- Присвоение Null-Coalescing C # 8.0
- В C # 8.0 вводится функция null-coalesci оператор присваивания ng ?? =.
- medium.com
- Что такое интерфейсы по умолчанию? C # 8.0
- Начиная с C # 8.0, вы можете определить реализацию, объявляя член интерфейса.
- medium.com
- Расширенный шаблон свойств C # 8.0
- В статье описывается, как сопоставление шаблонов обеспечивает эффективный способ использования и обработки этих данных в формы, которые…
- medium.com
OpenXml SDK (краткое руководство C #)
КОНЦЕПЦИИ C #
Программная работа с файлами Excel с использованием OpenXml SDK.


В статьях показано, как программно работать с документом Excel в консольном приложении C #.
Установить ниже pac кадры из NuGet
DocumentFormat. OpenXml
Следующие «Директивы сборки» используются для компиляции кода
с использованием DocumentFormat.OpenXml;
с использованием DocumentFormat.OpenXml.Packaging;
с помощью DocumentFormat.OpenXml.Spreadsheet;
Чтобы создать документ Excel, создайте экземпляр класса « SpreadsheetDocument» .
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create
(
путь к файлу,
SpreadsheetDocumentType.Workbook
);
Есть много перегрузок конструктора для SpreadsheetDocument , но приведенный выше экземпляр принимает два аргумента.
- Путь к файлу: путь назначения для сохранения окончательного файла Excel.
- SpreadSheetDocumentType: определяет тип документа Excel.
Перечисление доступных типов документов в SDK:
Выберите подходящий SpreadsheetDocumentType и убедитесь, что путь к файлу, в котором сохраняется выходной файл Excel, правильный, с соответствующим расширением имени файла.
Если SpreadsheetDocumentType не соответствует расширению имени выходного файла, при открытии файла возникает ошибка.
//Книга Excel (* .xlsx).
Workbook = 0,
//Шаблон Excel (* .xltx).
Template = 1,
//Книга Excel с поддержкой макросов (* .xlsm).
MacroEnabledWorkbook = 2,
//Шаблон Excel с поддержкой макросов (* .xltm).
MacroEnabledTemplate = 3,
//Надстройка Excel (* .xlam).
AddIn = 4
ПРИМЕЧАНИЕ. Для демонстрации используется тип документа Workbook , а расширение пути к файлу должно соответствовать « .xlsx.»
По крайней мере, в документе должна быть часть книги, которая действует как контейнер для записей Excel.
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart ();
workbookpart.Workbook = new Workbook ();
Итак, чтобы добавить часть книги, функция « AddWorkbookPart » класса SpreadsheetDocument является называется. У части книги должен быть хотя бы один рабочий лист. Итак, следующим шагом будет добавление рабочего листа.
Чтобы добавить рабочий лист, создайте экземпляр класса Sheet .
//Добавление листов в книгу.
Sheets sheet = spreadsheetDocument.WorkbookPart.Workbook.
AppendChild (new Sheets ()); //Добавляем новый лист и связываем его с книгой.
Sheet Sheet = new Sheet ()
{
Id = spreadsheetDocument .WorkbookPart.GetIdOfPart (worksheetPart) ,
SheetId = 1,
Name = sheetName
}; sheet.Append (sheet);
Для создания листа требуется несколько параметров, таких как Id, SheetId и имя.
Перед созданием листа создайте часть листа и добавьте ее в книгу.
WorksheetPart worksheetPart = workbookpart.AddNewPart (); worksheetPart.Worksheet = new Worksheet (new SheetData ());
Последний шаг — сохранить workboot и закройте документ электронной таблицы.
workbookpart.Workbook.Save ();
spreadsheetDocument.Close ();
public static void CreateExcelFile (string filepath, string sheetName) {//Создайте документ электронной таблицы, указав путь к файлу.
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create (
путь к файлу,
SpreadsheetDocumentType.Workbook
); //Добавляем WorkbookPart в документ.
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart ();
workbookpart.Workbook = new Workbook (); //Добавить WorksheetPart в WorkbookPart.
WorksheetPart workheetPart = workbookpart.AddNewPart ();
worksheetPart.Worksheet = new Worksheet (new SheetData ()); //Добавить листы в Рабочая книга.
Sheets sheet = spreadsheetDocument.WorkbookPart.Workbook.
AppendChild (new Sheets ()); //Добавить новый рабочий лист и связать его вместе с книгой.
Sheet Sheet = new Sheet () {
Id = spreadsheetDocument.WorkbookPart.GetIdOfPart (worksheetPart),
SheetId = 1,
Name = sheetName
};
sheet.Append (sheet); //Сохранить и закрыть
workbookpart.Workbook.Save () ;
spreadsheetDocument.Close ();}
Приведенный ниже код используется для вставки данных в конкретный номер ячейки — например, A1, B1 и т. д.
Приведенный ниже метод используется для вставки текста данные в excel, который принимает следующие аргументы в качестве входных.
- docName: существующий путь к документу excel.
- text: Необходимо вставить строковое текстовое значение.
- cellName: Имя столбца Excel, например A, B, C, и т. д.
- cellNumber: Примеры номеров столбцов Excel, например 1, 2, 3, 4 и т. д.
Примеры вызовов следующих функций
OfflineExcel.InsertTextExistingExcel (@ "E: test.xlsx", "test1", "A", 1); OfflineExcel.InsertTextExistingExcel (@ " E: test.xlsx "," test2 "," B ", 1);
Используется функция ниже для создания новой ячейки
Приведенный ниже код используется для удаления данных в ячейку с определенным номером — например, A1, B1 и т. д.
Приведенный ниже метод используется для удаления данных из Excel, который принимает следующие аргументы в качестве входных.
- docName: Существующий путь к документу Excel .
- sheetName: имя листа внутри документа Excel..
- colName: имя столбца Excel, например A, B, C и т. д.
- rowIndex : В столбце Excel приведены примеры номеров 1, 2, 3, 4 и т. д.
Примеры вызовов функций, указанных ниже
OfflineExcel.DeleteTextFromCell (@ "E: test.xlsx", "test", "B", 1); OfflineExcel.DeleteTextFromCell (@ "E: test.xlsx", "test", "B", 4);
Функция ниже используется для получения существующего значения ячейки
GitHub Репо
ssukhpinder/InteropExample
Как создавать, изменять и удалять Excel операции с электронными таблицами — ssukhpinder/InteropExample
github.com
Заинтересованы в концепциях C # 8.0, вот некоторые ссылки
Присвоение Null-Coalescing C # 8.0
В C # 8.0 вводится функция null-coalesci оператор присваивания ng ?? =.
medium.com
Что такое интерфейсы по умолчанию? C # 8.0
Начиная с C # 8.0, вы можете определить реализацию, объявляя член интерфейса.
medium.com
Расширенный шаблон свойств C # 8.0
В статье описывается, как сопоставление шаблонов обеспечивает эффективный способ использования и обработки этих данных в формы, которые…
medium.com
Спасибо за чтение. Продолжайте посещать и поделитесь этим в своей сети. Пожалуйста, поделитесь своими мыслями и отзывами в разделе комментариев.
Следуйте за мной в LinkedIn Instagram Facebook Twitter