Как я могу создать электронную таблицу Excel с помощью C #, не требуя установки Excel на машине, на которой выполняется код?
Как создать файл Excel (.XLS и .XLSX) на C # без установки Microsoft Office?
Ответы (46)
Вы можете использовать библиотеку под названием ExcelLibrary. Это бесплатная библиотека с открытым исходным кодом, размещенная на Google Code:
Похоже, это порт PHP ExcelWriter, о котором вы упомянули выше. Он пока не будет записывать в новый формат .xlsx, но они работают над добавлением этой функции в.
Это очень просто, компактно и удобно. Кроме того, у него есть DataSetHelper, который позволяет использовать DataSets и DataTables для простой работы с данными Excel.
ExcelLibrary, похоже, по-прежнему работает только со старым форматом Excel (файлы .xls), но, возможно, в будущем добавит поддержку для новых форматов 2007/2010.
Вы также можете использовать EPPlus, который работает только с файлами формата Excel 2007/2010 (файлы .xlsx). Также существует NPOI, который работает с обоими.
В каждой библиотеке есть несколько известных ошибок, как указано в комментариях. В целом, EPPlus кажется лучшим выбором с течением времени. Похоже, он более активно обновляется и документируется.
Кроме того, как отмечает @ АртёмЦарионов ниже, EPPlus поддерживает сводные таблицы, а ExcelLibrary может иметь некоторую поддержку (Проблема со сводной таблицей в ExcelLibrary)
Вот пара ссылок для быстрого ознакомления:
ExcelLibrary - GNU Lesser GPL
EPPlus - GNU (LGPL) - больше не поддерживается
EPPlus 5 - Polyform Noncommercial - с мая 2020 г.
NPOI - Лицензия Apache
Вот пример кода для ExcelLibrary:
Вот пример получения данных из базы данных и создания из нее книги. Обратите внимание, что код ExcelLibrary представляет собой единственную строку внизу:
//Create the data set and table
DataSet ds = new DataSet("New_DataSet");
DataTable dt = new DataTable("New_DataTable");
//Set the locale for each
ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
//Open a DB connection (in this example with OleDB)
OleDbConnection con = new OleDbConnection(dbConnectionString);
con.Open();
//Create a query and fill the data table with the data from the DB
string sql = "SELECT Whatever FROM MyDBTable;";
OleDbCommand cmd = new OleDbCommand(sql, con);
OleDbDataAdapter adptr = new OleDbDataAdapter();
adptr.SelectCommand = cmd;
adptr.Fill(dt);
con.Close();
//Add the table to the data set
ds.Tables.Add(dt);
//Here's the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);
Создать файл Excel так просто. Вы также можете вручную создавать файлы Excel, но меня действительно впечатлила вышеуказанная функциональность.
Если вам нравится формат xlsx, попробуйте мой проект GitHub, EPPlus. Все началось с исходников из ExcelPackage, но сегодня это полная переработка. Он поддерживает диапазоны, стили ячеек, диаграммы, формы, изображения, именованные диапазоны, автофильтр и многое другое.
LoadFromCollection<T>
, LoadFromDataTable
и т. Д. (Можно найти через здесь)
- person PeterX; 24.02.2015
А как насчет использования Open XML SDK 2.0 для Microsoft Office?
Несколько преимуществ:
- Не требует установки Office
- Сделано Microsoft = достойная документация MSDN
- Всего одна .Net dll для использования в проекте
- SDK поставляется с множеством инструментов, таких как diff, validator и т. Д.
Ссылки:
- Github
- Основной целевой сайт MSDN
- Начальная страница "Как мне ..."
- blogs.MSDN brian_jones анонсировать SDK
- blogs.MSDN brian_jones описание SDK, обрабатывающего большие файлы без сбоев (в отличие от метода DOM)
Я успешно использовал следующие проекты с открытым исходным кодом:
ExcelPackage для форматов OOXML (Office 2007)
NPOI для формата .XLS (Office 2003). NPOI 2.0 (бета) также поддерживает XLSX.
Взгляните на мои сообщения в блоге:
Создание электронных таблиц Excel .XLS и .XLSX на C # < / а>
NPOI с таблицей Excel и динамической диаграммой а>
Вы можете использовать OLEDB для создания файлов Excel и управления ими. Проверьте это: Чтение и запись в Excel с помощью OLEDB .
Типичный пример:
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'"))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn);
cmd.ExecuteNonQuery();
}
РЕДАКТИРОВАТЬ - Еще несколько ссылок:
- Привет, сценарист! Как я могу читать из Excel без использования Excel?
- Как использовать ADO.NET для получения и изменения записей в книге Excel с помощью Visual Basic .NET
- Чтение и запись электронных таблиц Excel с использованием ADO.NET C # DbProviderFactory
Коммерческое решение, SpreadsheetGear для .NET, сделает это.
Вы можете увидеть живые образцы ASP.NET (C # и VB) здесь и загрузить ознакомительную версию здесь.
Отказ от ответственности: я владею SpreadsheetGear LLC
Я использовал несколько вариантов:
Если XLSX необходим: ExcelPackage - хорошее начало, но оно исчезло, когда разработчик прекратил работу. Это. ExML взял оттуда и добавил несколько функций. ExML - неплохой вариант, я все еще использую его на нескольких производственных веб-сайтах. .
Однако для всех моих новых проектов я использую NPOI, порт .NET для Apache POI. NPOI 2.0 (Alpha) также поддерживает XLSX.
Чрезвычайно легким вариантом может быть использование HTML-таблиц. Просто создайте теги head, body и table в файле и сохраните его как файл с расширением .xls. Есть специальные атрибуты Microsoft, которые можно использовать для стилизации вывода, включая формулы.
Я понимаю, что вы, возможно, не кодируете это в веб-приложении, но вот пример композиции файла Excel с помощью таблицы HTML. Этот метод можно использовать, если вы кодируете консольное приложение, настольное приложение или службу.
Если вы создаете файлы Excel 2007/2010, попробуйте этот проект с открытым исходным кодом: https://github.com/closedxml/closedxml
Он предоставляет объектно-ориентированный способ управления файлами (аналогично VBA), не беспокоясь о проблемах с XML-документами. Его можно использовать на любом языке .NET, таком как C # и Visual Basic (VB).
ClosedXML позволяет создавать файлы Excel 2007/2010 без приложения Excel. Типичный пример - создание отчетов Excel на веб-сервере:
var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sample Sheet"); worksheet.Cell("A1").Value = "Hello World!"; workbook.SaveAs("HelloWorld.xlsx");
На самом деле вы можете захотеть проверить классы взаимодействия, доступные в C # (например, Microsoft.Office.Interop.Excel
. Вы говорите, что нет OLE (а это не так), но классы взаимодействия очень просты в использовании. Ознакомьтесь с Документация по C # здесь (Interop для Excel начинается на странице 1072 документа C # PDF).
Вы можете быть впечатлены, если не пробовали их.
Обратите внимание на позицию Microsoft по этому поводу:
В настоящее время Microsoft не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любых автоматических, неинтерактивных клиентских приложений или компонентов (включая службы ASP, ASP.NET, DCOM и NT), поскольку Office может демонстрировать нестабильное поведение и / или тупик, когда Office работает в этой среде.
Вот полностью бесплатная библиотека C #, которая позволяет экспортировать из DataSet
, DataTable
или List<>
в настоящий файл Excel 2007.xlsx, используя библиотеки OpenXML:
http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm
Предоставляется полный исходный код - бесплатно - вместе с инструкциями и демонстрационным приложением.
После добавления этого класса в приложение вы можете экспортировать DataSet в Excel всего одной строкой кода:
CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");
Нет ничего проще ...
И для этого даже не требуется наличие Excel на вашем сервере.
Вы можете рассмотреть возможность создания файлов в формате XML Spreadsheet 2003. Это простой формат XML с использованием хорошо документированная схема.
Вы можете взглянуть на GemBox.Spreadsheet.
У них есть бесплатная версия со всеми функциями, но с ограничением до 150 строк на лист и 5 листов на книгу, если это соответствует вашим потребностям.
Сам пока не пользовался, но смотрится интересно.
Syncfusion Essential XlsIO может это сделать. Он не зависит от Microsoft Office, а также имеет специальную поддержку для разных платформ.
- ASP.NET
- ASP.NET MVC
- UWP
- Xamarin
- WPF и Windows Forms
- Службы Windows и пакетные операции
Пример кода:
//Creates a new instance for ExcelEngine.
ExcelEngine excelEngine = new ExcelEngine();
//Loads or open an existing workbook through Open method of IWorkbooks
IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName);
//To-Do some manipulation|
//To-Do some manipulation
//Set the version of the workbook.
workbook.Version = ExcelVersion.Excel2013;
//Save the workbook in file system as xlsx format
workbook.SaveAs(outputFileName);
Полный набор элементов управления доступен бесплатно в рамках программы сообщества, если вы соответствуете требованиям (менее 1 миллионов долларов США дохода). Примечание: я работаю в Syncfusion.
Хорошо,
вы также можете использовать стороннюю библиотеку, например Aspose.
Эта библиотека имеет то преимущество, что не требует установки Excel на вашем компьютере, что было бы идеально в вашем случае.
OpenXML также является хорошей альтернативой, которая помогает избежать установки MS Excel на сервере. Open XML SDK 2.0, предоставляемый Microsoft, упрощает задачу управления пакетами Open XML и базовыми элементами схемы Open XML внутри пакета. Интерфейс прикладного программирования (API) Open XML инкапсулирует множество общих задач, которые разработчики выполняют с пакетами Open XML.
Проверьте это OpenXML: альтернатива, которая помогает избежать установки MS Excel на сервере
Различные доступные XML-библиотеки Office 2003 довольно хорошо работают с небольшими файлами Excel. Однако я считаю проблемой сам размер большой книги, сохраненной в формате XML. Например, рабочая книга, с которой я работаю, будет иметь размер 40 МБ в новом (и, по общему признанию, более плотно упакованном) формате XLSX, становится файлом XML размером 360 МБ.
Насколько я понял, есть два коммерческих пакета, которые позволяют вывод в старые двоичные форматы файлов. Они есть:
Ни то, ни другое не из дешевых (я думаю, 500 и 800 долларов соответственно). но оба работают независимо от самого Excel.
Что мне было бы интересно, так это модуль вывода Excel для подобных OpenOffice.org. Интересно, можно ли их портировать с Java на .Net.
Я согласен с созданием таблиц XML, вот пример того, как это сделать для C # 3 (все просто пишут об этом в блогах в VB 9: P) http://www.aaron-powell.com/linq-to-xml-to-excel
Я написал простой код для экспорта набора данных в Excel без использования объекта excel с помощью System.IO.StreamWriter.
Ниже приведен код, который будет читать все таблицы из набора данных и записывать их на листы одну за другой. Мне помогли этой статьи < / а>.
public static void exportToExcel(DataSet source, string fileName)
{
const string endExcelXML = "</Workbook>";
const string startExcelXML = "<xml version>\r\n<Workbook " +
"xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
" xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " +
"xmlns:x=\"urn:schemas- microsoft-com:office:" +
"excel\"\r\n xmlns:ss=\"urn:schemas-microsoft-com:" +
"office:spreadsheet\">\r\n <Styles>\r\n " +
"<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
"<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
"\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
"\r\n <Protection/>\r\n </Style>\r\n " +
"<Style ss:ID=\"BoldColumn\">\r\n <Font " +
"x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
"<Style ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
" ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
"ss:ID=\"Decimal\">\r\n <NumberFormat " +
"ss:Format=\"0.0000\"/>\r\n </Style>\r\n " +
"<Style ss:ID=\"Integer\">\r\n <NumberFormat " +
"ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
"ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
"ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n " +
"</Styles>\r\n ";
System.IO.StreamWriter excelDoc = null;
excelDoc = new System.IO.StreamWriter(fileName);
int sheetCount = 1;
excelDoc.Write(startExcelXML);
foreach (DataTable table in source.Tables)
{
int rowCount = 0;
excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
excelDoc.Write("<Table>");
excelDoc.Write("<Row>");
for (int x = 0; x < table.Columns.Count; x++)
{
excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
excelDoc.Write(table.Columns[x].ColumnName);
excelDoc.Write("</Data></Cell>");
}
excelDoc.Write("</Row>");
foreach (DataRow x in table.Rows)
{
rowCount++;
//if the number of rows is > 64000 create a new page to continue output
if (rowCount == 64000)
{
rowCount = 0;
sheetCount++;
excelDoc.Write("</Table>");
excelDoc.Write(" </Worksheet>");
excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
excelDoc.Write("<Table>");
}
excelDoc.Write("<Row>"); //ID=" + rowCount + "
for (int y = 0; y < table.Columns.Count; y++)
{
System.Type rowType;
rowType = x[y].GetType();
switch (rowType.ToString())
{
case "System.String":
string XMLstring = x[y].ToString();
XMLstring = XMLstring.Trim();
XMLstring = XMLstring.Replace("&", "&");
XMLstring = XMLstring.Replace(">", ">");
XMLstring = XMLstring.Replace("<", "<");
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write(XMLstring);
excelDoc.Write("</Data></Cell>");
break;
case "System.DateTime":
//Excel has a specific Date Format of YYYY-MM-DD followed by
//the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
//The Following Code puts the date stored in XMLDate
//to the format above
DateTime XMLDate = (DateTime)x[y];
string XMLDatetoString = ""; //Excel Converted Date
XMLDatetoString = XMLDate.Year.ToString() +
"-" +
(XMLDate.Month < 10 ? "0" +
XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
"-" +
(XMLDate.Day < 10 ? "0" +
XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
"T" +
(XMLDate.Hour < 10 ? "0" +
XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
":" +
(XMLDate.Minute < 10 ? "0" +
XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
":" +
(XMLDate.Second < 10 ? "0" +
XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
".000";
excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" +
"<Data ss:Type=\"DateTime\">");
excelDoc.Write(XMLDatetoString);
excelDoc.Write("</Data></Cell>");
break;
case "System.Boolean":
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.Int16":
case "System.Int32":
case "System.Int64":
case "System.Byte":
excelDoc.Write("<Cell ss:StyleID=\"Integer\">" +
"<Data ss:Type=\"Number\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.Decimal":
case "System.Double":
excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" +
"<Data ss:Type=\"Number\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.DBNull":
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write("");
excelDoc.Write("</Data></Cell>");
break;
default:
throw (new Exception(rowType.ToString() + " not handled."));
}
}
excelDoc.Write("</Row>");
}
excelDoc.Write("</Table>");
excelDoc.Write(" </Worksheet>");
sheetCount++;
}
excelDoc.Write(endExcelXML);
excelDoc.Close();
}
Я недавно использовал FlexCel.NET и обнаружил это должна быть отличная библиотека! Я не говорю этого о слишком многих программных продуктах. Нет смысла описывать здесь всю коммерческую идею, вы можете прочитать все функции на их веб-сайте.
Это коммерческий продукт, но вы получите полный исходный код, если купите его. Итак, я полагаю, вы могли бы скомпилировать его в свою сборку, если бы действительно захотели. В противном случае это всего лишь одна дополнительная сборка для xcopy - без настройки, установки или чего-то в этом роде.
Я не думаю, что вы найдете способ сделать это без сторонних библиотек, поскольку .NET framework, очевидно, не имеет встроенной поддержки для этого, а OLE Automation - это просто целый мир боли.
Просто хочу добавить еще одну ссылку на стороннее решение, которое напрямую решает вашу проблему: http://www.officewriter.com
(Отказ от ответственности: я работаю в SoftArtisans, компании, которая делает OfficeWriter)
Вот способ сделать это с помощью LINQ to XML вместе с образцом кода:
Быстрый импорт и экспорт данных Excel с помощью LINQ to XML
Это немного сложно, поскольку вам нужно импортировать пространства имен и так далее, но это позволяет избежать любых внешних зависимостей.
(Кроме того, конечно, это VB .NET, а не C #, но вы всегда можете изолировать материал VB .NET в своем собственном проекте, чтобы использовать XML-литералы, а все остальное делать на C #.)
Некоторые сторонние поставщики компонентов, такие как Infragistics или Syncfusion, предоставляют очень хорошие возможности экспорта в Excel, которые не требуют установки Microsoft Excel.
Поскольку эти поставщики также предоставляют расширенные компоненты сетки пользовательского интерфейса, эти компоненты особенно удобны, если вы хотите, чтобы стиль и макет экспорта в Excel имитировали текущее состояние сетки в пользовательском интерфейсе вашего приложения.
Если ваш экспорт предназначен для выполнения на стороне сервера с акцентом на экспортируемые данные и без ссылки на пользовательский интерфейс, я бы выбрал один из бесплатных вариантов с открытым исходным кодом (например, ExcelLibrary).
Раньше я участвовал в проектах, в которых пытались использовать автоматизацию на стороне сервера в пакете Microsoft Office. Основываясь на этом опыте, я настоятельно рекомендую отказаться от такого подхода.
public class GridViewExportUtil
{
public static void Export(string fileName, GridView gv)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader(
"content-disposition", string.Format("attachment; filename={0}", fileName));
HttpContext.Current.Response.ContentType = "application/ms-excel";
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
// Create a form to contain the grid
Table table = new Table();
// add the header row to the table
if (gv.HeaderRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
table.Rows.Add(gv.HeaderRow);
}
// add each of the data rows to the table
foreach (GridViewRow row in gv.Rows)
{
GridViewExportUtil.PrepareControlForExport(row);
table.Rows.Add(row);
}
// add the footer row to the table
if (gv.FooterRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
table.Rows.Add(gv.FooterRow);
}
// render the table into the htmlwriter
table.RenderControl(htw);
// render the htmlwriter into the response
HttpContext.Current.Response.Write(sw.ToString());
HttpContext.Current.Response.End();
}
}
}
/// <summary>
/// Replace any of the contained controls with literals
/// </summary>
/// <param name="control"></param>
private static void PrepareControlForExport(Control control)
{
for (int i = 0; i < control.Controls.Count; i++)
{
Control current = control.Controls[i];
if (current is LinkButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
}
else if (current is ImageButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
}
else if (current is HyperLink)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
}
else if (current is DropDownList)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
}
else if (current is CheckBox)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
}
if (current.HasControls())
{
GridViewExportUtil.PrepareControlForExport(current);
}
}
}
}
Привет, это решение - экспортировать представление сетки в файл Excel, это может вам помочь
Вы можете создавать красиво отформатированные файлы Excel с помощью этой библиотеки: http://officehelper.codeplex.com/documentation < br> См. пример ниже:
using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME))
{
helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN;
helper.CurrentSheetName = "Sheet1";
helper.CurrentPosition = new CellRef("C3");
//the template xlsx should contains the named range "header"; use the command "insert"/"name".
helper.InsertRange("header");
//the template xlsx should contains the named range "sample1";
//inside this range you should have cells with these values:
//<name> , <value> and <comment>, which will be replaced by the values from the getSample()
CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List<string> {"name", "value", "comment"});
helper.InsertRange(sample1, getSample());
//you could use here other named ranges to insert new cells and call InsertRange as many times you want,
//it will be copied one after another;
//even you can change direction or the current cell/sheet before you insert
//typically you put all your "template ranges" (the names) on the same sheet and then you just delete it
helper.DeleteSheet("Sheet3");
}
где образец выглядит так:
private IEnumerable<List<object>> getSample()
{
var random = new Random();
for (int loop = 0; loop < 3000; loop++)
{
yield return new List<object> {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop};
}
}
Самый простой и быстрый способ создать файл Excel из C # - использовать инструмент повышения производительности Open XML. Инструмент повышения производительности Open XML поставляется с установкой Open XML SDK. Инструмент выполняет обратное преобразование любого файла Excel в код C #. Затем код C # можно использовать для повторного создания этого файла.
Обзор вовлеченного процесса:
- Установите Open XML SDK с помощью инструмента.
- Создайте файл Excel с помощью последней версии клиента Excel с желаемым видом. Назовите его
DesiredLook.xlsx
. - Откройте инструмент
DesiredLook.xlsx
и нажмите кнопку Reflect Code вверху. - Код C # для вашего файла будет сгенерирован на правой панели инструмента. Добавьте это в свое решение C # и сгенерируйте файлы с желаемым видом.
В качестве бонуса этот метод работает с любыми файлами Word и PowerPoint. Как разработчик C #, вы затем внесете в код изменения в соответствии со своими потребностями.
Я разработал простое приложение WPF на github, которое для этой цели будет работать в Windows. Существует класс-заполнитель GeneratedClass
, куда вы можете вставить сгенерированный код. Если вы вернетесь к одной версии файла, он сгенерирует файл Excel, подобный этому:
Некоторая полезная автоматизация Excel на C #, вы можете найти по следующей ссылке.
http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm
Болтон.
Посмотрите примеры создания файлов Excel.
Примеры есть на C # и VB.NET
Он управляет файлами XSL XSLX и CSV Excel.
http://www.devtriogroup.com/ExcelJetcell/Samples/Default.aspx
Вы когда-нибудь пробовали силк?
Раньше мы генерировали таблицы Excel в классическом формате asp как sylk, а сейчас мы ищем также генератор Excel.
Преимущества sylk в том, что вы можете форматировать ячейки.
Решение Java с открытым исходным кодом - это Apache POI. Возможно, здесь есть способ настроить взаимодействие, но я недостаточно знаю Java, чтобы ответить на этот вопрос.
Когда я исследовал эту проблему, я остановился на сборках Interop.
Вы можете просто записать его в XML, используя формат Excel XML, и назвать его с расширением .XLS, и он откроется в excel. Вы можете управлять всем форматированием (полужирным шрифтом, шириной и т. Д.) В заголовке XML-файла.
Существует пример XML из Википедии.
Я также голосую за GemBox.Spreadsheet.
Очень быстрый и простой в использовании, с множеством примеров на их сайте.
Взял свои задачи по отчетности на совершенно новый уровень скорости выполнения.
Один действительно простой вариант, о котором часто забывают, - это создать отчет .rdlc, используя Microsoft Reporting и экспортируйте его в формат Excel. Вы можете создать его в Visual Studio и сгенерировать файл, используя:
localReport.Render("EXCELOPENXML", null, ((name, ext, encoding, mimeType, willSeek) => stream = new FileStream(name, FileMode.CreateNew)), out warnings);
Вы также можете экспортировать его в .doc или .pdf, используя "WORDOPENXML"
и "PDF"
соответственно, и он поддерживается на многих различных платформах, таких как ASP.NET и SSRS.
Намного проще вносить изменения в визуальный дизайнер, где вы можете видеть результаты, и поверьте мне, как только вы начнете группировать данные, форматировать заголовки групп, добавлять новые разделы, вы не захотите возиться с десятками узлов XML.
Вы можете попробовать мою библиотеку SwiftExcel. Эта библиотека записывает непосредственно в файл, поэтому она очень эффективна. Например, вы можете записать 100 тыс. Строк за несколько секунд без использования памяти.
Вот простой пример использования:
using (var ew = new ExcelWriter("C:\\temp\\test.xlsx"))
{
for (var row = 1; row <= 10; row++)
{
for (var col = 1; col <= 5; col++)
{
ew.Write($"row:{row}-col:{col}", col, row);
}
}
}
http://www.codeproject.com/KB/cs/Excel_and_C_.aspx ‹= Почему бы просто не использовать встроенный power windows, просто установить офис на сервере, любое приложение, которое вы устанавливаете, можно автоматизировать.
Намного проще просто использовать собственные методы.
Если он установлен, вы можете использовать его, это самая крутая и малоиспользуемая функция в Windows, она была названа COM еще в старые добрые времена, и она экономит вам массу времени и боли.
Или, что еще проще, просто используйте расходные материалы MS ref lib - http://csharp.net-informations.com/excel/csharp-create-excel.htm
Как создать файл Excel (.xslx) с помощью C # в OneDrive без установки Microsoft Office
Microsoft Graph API предоставляет API-интерфейсы файлов и Excel для создания и изменения файлов Excel, хранящихся в OneDrive. как для корпоративных, так и для потребительских счетов. Пакет NuGet Microsoft.Graph предоставляет множество интерфейсов для работы с API файлов и Excel.
{
Name = "myExcelFile.xslx",
File = new Microsoft.Graph.File()
};
// Create an empty file in the user's OneDrive.
var excelWorkbookDriveItem = await graphClient.Me.Drive.Root.Children.Request().AddAsync(excelWorkbook);
// Add the contents of a template Excel file.
DriveItem excelDriveItem;
using (Stream ms = ResourceHelper.GetResourceAsStream(ResourceHelper.ExcelTestResource))
{
//Upload content to the file. ExcelTestResource is an empty template Excel file.
//https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/item_uploadcontent
excelDriveItem = await graphClient.Me.Drive.Items[excelWorkbookDriveItem.Id].Content.Request().PutAsync<DriveItem>(ms);
}
На этом этапе у вас есть файл Excel, созданный в OneDrive пользователя (предприятия или потребителя) или группы. Теперь вы можете использовать API Excel, чтобы вносить изменения в файл Excel без использования Excel и без необходимости понимать формат Excel XML.
Вы можете установить пакет OpenXml nuget в Visual Studio. Вот небольшой код для экспорта таблицы данных в файл Excel:
Imports DocumentFormat.OpenXml
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
Public Class ExportExcelClass
Public Sub New()
End Sub
Public Sub ExportDataTable(ByVal table As DataTable, ByVal exportFile As String)
' Create a spreadsheet document by supplying the filepath.
' By default, AutoSave = true, Editable = true, and Type = xlsx.
Dim spreadsheetDocument As SpreadsheetDocument = spreadsheetDocument.Create(exportFile, SpreadsheetDocumentType.Workbook)
' Add a WorkbookPart to the document.
Dim workbook As WorkbookPart = spreadsheetDocument.AddWorkbookPart
workbook.Workbook = New Workbook
' Add a WorksheetPart to the WorkbookPart.
Dim Worksheet As WorksheetPart = workbook.AddNewPart(Of WorksheetPart)()
Worksheet.Worksheet = New Worksheet(New SheetData())
' Add Sheets to the Workbook.
Dim sheets As Sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(Of Sheets)(New Sheets())
Dim data As SheetData = Worksheet.Worksheet.GetFirstChild(Of SheetData)()
Dim Header As Row = New Row()
Header.RowIndex = CType(1, UInt32)
For Each column As DataColumn In table.Columns
Dim headerCell As Cell = createTextCell(table.Columns.IndexOf(column) + 1, 1, column.ColumnName)
Header.AppendChild(headerCell)
Next
data.AppendChild(Header)
Dim contentRow As DataRow
For i As Integer = 0 To table.Rows.Count - 1
contentRow = table.Rows(i)
data.AppendChild(createContentRow(contentRow, i + 2))
Next
End Sub
Private Function createTextCell(ByVal columnIndex As Integer, ByVal rowIndex As Integer, ByVal cellValue As Object) As Cell
Dim cell As Cell = New Cell()
cell.DataType = CellValues.InlineString
cell.CellReference = getColumnName(columnIndex) + rowIndex.ToString
Dim inlineString As InlineString = New InlineString()
Dim t As Text = New Text()
t.Text = cellValue.ToString()
inlineString.AppendChild(t)
cell.AppendChild(inlineString)
Return cell
End Function
Private Function createContentRow(ByVal dataRow As DataRow, ByVal rowIndex As Integer) As Row
Dim row As Row = New Row With {
.rowIndex = CType(rowIndex, UInt32)
}
For i As Integer = 0 To dataRow.Table.Columns.Count - 1
Dim dataCell As Cell = createTextCell(i + 1, rowIndex, dataRow(i))
row.AppendChild(dataCell)
Next
Return row
End Function
Private Function getColumnName(ByVal columnIndex As Integer) As String
Dim dividend As Integer = columnIndex
Dim columnName As String = String.Empty
Dim modifier As Integer
While dividend > 0
modifier = (dividend - 1) Mod 26
columnName = Convert.ToChar(65 + modifier).ToString() & columnName
dividend = CInt(((dividend - modifier) / 26))
End While
Return columnName
End Function
End Class
spreadsheetDocument.Create
будет SpreadsheetDocument.Create
?
- person Kiquenet; 30.01.2021
Если вы создаете таблицу данных или datagridview из кода, вы можете сохранить все данные, используя этот простой метод. Этот метод не рекомендуется, но он работает на 100%, даже если вы не устанавливаете MS Excel на свой компьютер.
try
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "Excel Documents (*.xls)|*.xls";
saveFileDialog1.FileName = "Employee Details.xls";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string fname = saveFileDialog1.FileName;
StreamWriter wr = new StreamWriter(fname);
for (int i = 0; i <DataTable.Columns.Count; i++)
{
wr.Write(DataTable.Columns[i].ToString().ToUpper() + "\t");
}
wr.WriteLine();
//write rows to excel file
for (int i = 0; i < (DataTable.Rows.Count); i++)
{
for (int j = 0; j < DataTable.Columns.Count; j++)
{
if (DataTable.Rows[i][j] != null)
{
wr.Write(Convert.ToString(getallData.Rows[i][j]) + "\t");
}
else
{
wr.Write("\t");
}
}
//go to next line
wr.WriteLine();
}
//close file
wr.Close();
}
}
catch (Exception)
{
MessageBox.Show("Error Create Excel Sheet!");
}
Некоторое время назад я создал DLL поверх NPOI. Пользоваться им очень просто:
IList<DummyPerson> dummyPeople = new List<DummyPerson>();
//Add data to dummyPeople...
IExportEngine engine = new ExcelExportEngine();
engine.AddData(dummyPeople);
MemoryStream memory = engine.Export();
Вы можете прочитать об этом здесь.
Кстати, это 100% открытый исходный код. Не стесняйтесь использовать, редактировать и делиться;)
Чтобы сохранить xls в формате xlsx, нам просто нужно вызвать метод SaveAs
из библиотеки Microsoft.Office.Interop.Excel
. Этот метод принимает около 16 параметров, и один из них также является форматом файла.
Документ Microsoft: Здесь Аргументы метода SaveAs
Объект, который нам нужно передать, похож на
wb.SaveAs(filename, 51, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, false, false, 1,1, true,
System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value)
Здесь 51 - это значение перечисления для XLSX.
Для сохранения в различных форматах файлов вы можете ссылаться на xlFileFormat
Интересно, почему никто не предложил PowerShell с бесплатным модулем ImportExcel; он с легкостью создает файлы XML-Excel (xlsx).
Особенно просто при создании таблиц Excel из баз данных, таких как SQL Server ...
Я снова перекодировал код, и теперь вы можете создать файл .xls, позже вы можете преобразовать его в формат Open XML Excel 2003.
private static void exportToExcel(DataSet source, string fileName)
{
// Documentacion en:
// https://en.wikipedia.org/wiki/Microsoft_Office_XML_formats
// https://answers.microsoft.com/en-us/msoffice/forum/all/how-to-save-office-ms-xml-as-xlsx-file/4a77dae5-6855-457d-8359-e7b537beb1db
// https://riptutorial.com/es/openxml
const string startExcelXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"+
"<?mso-application progid=\"Excel.Sheet\"?>\r\n" +
"<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
"xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " +
"xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\r\n " +
"xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n " +
"xmlns:html=\"http://www.w3.org/TR/REC-html40\">\r\n " +
"xmlns:html=\"https://www.w3.org/TR/html401/\">\r\n " +
"<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">\r\n " +
" <Version>16.00</Version>\r\n " +
"</DocumentProperties>\r\n " +
" <OfficeDocumentSettings xmlns=\"urn:schemas-microsoft-com:office:office\">\r\n " +
" <AllowPNG/>\r\n " +
" </OfficeDocumentSettings>\r\n " +
" <ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">\r\n " +
" <WindowHeight>9750</WindowHeight>\r\n " +
" <WindowWidth>24000</WindowWidth>\r\n " +
" <WindowTopX>0</WindowTopX>\r\n " +
" <WindowTopY>0</WindowTopY>\r\n " +
" <RefModeR1C1/>\r\n " +
" <ProtectStructure>False</ProtectStructure>\r\n " +
" <ProtectWindows>False</ProtectWindows>\r\n " +
" </ExcelWorkbook>\r\n " +
"<Styles>\r\n " +
"<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
"<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
"\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
"\r\n <Protection/>\r\n </Style>\r\n " +
"<Style ss:ID=\"BoldColumn\">\r\n <Font " +
"x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
"<Style ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
" ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
"ss:ID=\"Decimal\">\r\n <NumberFormat " +
"ss:Format=\"0.0000\"/>\r\n </Style>\r\n " +
"<Style ss:ID=\"Integer\">\r\n <NumberFormat/>" +
"ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
"ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
"ss:Format=\"dd/mm/yyyy;@\"/>\r\n </Style>\r\n " +
"</Styles>\r\n ";
System.IO.StreamWriter excelDoc = null;
excelDoc = new System.IO.StreamWriter(fileName,false);
int sheetCount = 1;
excelDoc.Write(startExcelXML);
foreach (DataTable table in source.Tables)
{
int rowCount = 0;
excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
excelDoc.Write("<Table>");
excelDoc.Write("<Row>");
for (int x = 0; x < table.Columns.Count; x++)
{
excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
excelDoc.Write(table.Columns[x].ColumnName);
excelDoc.Write("</Data></Cell>");
}
excelDoc.Write("</Row>");
foreach (DataRow x in table.Rows)
{
rowCount++;
//if the number of rows is > 64000 create a new page to continue output
if (rowCount == 1048576)
{
rowCount = 0;
sheetCount++;
excelDoc.Write("</Table>");
excelDoc.Write(" </Worksheet>");
excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
excelDoc.Write("<Table>");
}
excelDoc.Write("<Row>"); //ID=" + rowCount + "
for (int y = 0; y < table.Columns.Count; y++)
{
System.Type rowType;
rowType = x[y].GetType();
switch (rowType.ToString())
{
case "System.String":
string XMLstring = x[y].ToString();
XMLstring = XMLstring.Trim();
XMLstring = XMLstring.Replace("&", "&");
XMLstring = XMLstring.Replace(">", ">");
XMLstring = XMLstring.Replace("<", "<");
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write(XMLstring);
excelDoc.Write("</Data></Cell>");
break;
case "System.DateTime":
//Excel has a specific Date Format of YYYY-MM-DD followed by
//the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
//The Following Code puts the date stored in XMLDate
//to the format above
DateTime XMLDate = (DateTime)x[y];
string XMLDatetoString = ""; //Excel Converted Date
XMLDatetoString = XMLDate.Year.ToString() +
"-" +
(XMLDate.Month < 10 ? "0" +
XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
"-" +
(XMLDate.Day < 10 ? "0" +
XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
"T" +
(XMLDate.Hour < 10 ? "0" +
XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
":" +
(XMLDate.Minute < 10 ? "0" +
XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
":" +
(XMLDate.Second < 10 ? "0" +
XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
".000";
excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" +
"<Data ss:Type=\"DateTime\">");
excelDoc.Write(XMLDatetoString);
excelDoc.Write("</Data></Cell>");
break;
case "System.Boolean":
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.Int16":
case "System.Int32":
case "System.Int64":
case "System.Byte":
excelDoc.Write("<Cell ss:StyleID=\"Integer\">" +
"<Data ss:Type=\"Number\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.Decimal":
case "System.Double":
excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" +
"<Data ss:Type=\"Number\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.DBNull":
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write("");
excelDoc.Write("</Data></Cell>");
break;
default:
throw (new Exception(rowType.ToString() + " not handled."));
}
}
excelDoc.Write("</Row>");
}
excelDoc.Write("</Table>");
excelDoc.Write("</Worksheet>");
sheetCount++;
}
const string endExcelOptions1 = "\r\n<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">\r\n" +
"<Selected/>\r\n" +
"<ProtectObjects>False</ProtectObjects>\r\n" +
"<ProtectScenarios>False</ProtectScenarios>\r\n" +
"</WorksheetOptions>\r\n";
excelDoc.Write(endExcelOptions1);
excelDoc.Write("</Workbook>");
excelDoc.Close();
}
проверьте это, нет необходимости в сторонних библиотеках, вы можете просто экспортировать данные с данными в файл Excel, используя это
var dt = "your code for getting data into datatable";
Response.ClearContent();
Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd")));
Response.ContentType = "application/vnd.ms-excel";
string tab = "";
foreach (DataColumn dataColumn in dt.Columns)
{
Response.Write(tab + dataColumn.ColumnName);
tab = "\t";
}
Response.Write("\n");
int i;
foreach (DataRow dataRow in dt.Rows)
{
tab = "";
for (i = 0; i < dt.Columns.Count; i++)
{
Response.Write(tab + dataRow[i].ToString());
tab = "\t";
}
Response.Write("\n");
}
Response.End();
Я использую следующий код для создания файла excel 2007, который создает файл и записывает его в этот файл, но когда я открываю файл, он дает мне ошибку, что exel не может открыть файл, файл bcz может быть поврежден или расширение файла несовместимо. но если я использовал .xls для файла, он работал штраф
for (int i = 0; i < TotalFile; i++)
{
Contact.Clear();
if (innerloop == SplitSize)
{
for (int j = 0; j < SplitSize; j++)
{
string strContact = DSt.Tables[0].Rows[i * SplitSize + j][0].ToString();
Contact.Add(strContact);
}
string strExcel = strFileName + "_" + i.ToString() + ".xlsx";
File.WriteAllLines(strExcel, Contact.ToArray());
}
}
также ссылка
http://dotnet-magic.blogspot.in/2011/10/createformat-excel-file-from-cnet.html
Contact
класса, а вы не сказали нам, что это такое. Если это работает для xls, скорее всего, вы на самом деле пишете HTML, который не является настоящим файлом Excel. И ваша ссылка использует взаимодействие, которое как упомянуто выше не должно использоваться на стороне сервера и может замедлять заполнение больших таблиц.
- person Rup; 22.12.2014