Создайте файл Excel (.XLS и .XLSX) с С#

Как создать таблицу Excel с помощью С#, не требуя установки Excel на компьютере с кодом?

1585
задан mistrmark 30 сент. '08 в 1:30
источник поделиться
40 ответов
  • 1
  • 2

Вы можете использовать библиотеку под названием ExcelLibrary. Это бесплатная библиотека с открытым исходным кодом, размещенная в Google Code:

ExcelLibrary

Это выглядит как порт PHP ExcelWriter, о котором вы говорили выше. Он не будет писать в новый формат.xlsx, но они работают над добавлением этой функции.

Это очень просто, мало и легко использовать. Кроме того, у него есть DataSetHelper, который позволяет вам использовать DataSets и DataTables для простой работы с данными Excel.

ExcelLibrary, похоже, работает только для более старого формата Excel (файлы.xls), но может добавить поддержку в будущем для новых форматов 2007/2010.

Вы также можете использовать EPPlus, который работает только для файлов формата Excel 2007/2010 (файлы.xlsx).

В каждой библиотеке есть несколько известных ошибок, как указано в комментариях. В целом, EPPlus, кажется, лучший выбор по прошествии времени. Он, кажется, более активно обновляется и документируется.

Кроме того, как отметил @АртёмЦарионов ниже, EPPlus поддерживает сводные таблицы, а ExcelLibrary может иметь некоторую поддержку (проблема сводной таблицы в ExcelLibrary)

Вот несколько ссылок для быстрой справки:
ExcelLibrary - GNU Lesser GPL
EPPlus - GNU Lesser General Public License (LGPL)

Вот пример кода для 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 the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);

Создание файла Excel так же просто. Вы также можете вручную создавать файлы Excel, но приведенная выше функциональность меня впечатлила.

885
ответ дан Mike Webb 09 апр. '10 в 0:36
источник поделиться

Если вы довольны xlsx-форматом, попробуйте проект codeplex GitHub. EPPlus. Начал его с источника из ExcelPackage, но сегодня он переписывается. Поддерживает диапазоны, стили ячейки, диаграммы, фигуры, рисунки, namesranges, автофильтр и множество других вещей.

495
ответ дан Jan Källman 29 марта '10 в 15:25
источник поделиться

Я успешно использовал следующие проекты с открытым исходным кодом:

  • ExcelPackage для форматов OOXML (Office 2007)

  • NPOI для формата.XLS(Office 2003). NPOI 2.0 (Alpha) также поддерживает XLSX.

Взгляните на мои сообщения в блоге:

Создание таблиц Excel.XLS и.XLSX в С#

NPOI с таблицей Excel и динамической диаграммой

149
ответ дан Leniel Maccaferri 20 июня '09 в 23:48
источник поделиться

А как насчет использования Open XML SDK 2.0 для Microsoft Office?

Несколько преимуществ:

  • Не требуется установка Office
  • Сделано Microsoft = достойная документация MSDN
  • Только одна.Net dll для использования в проекте
  • SDK поставляется со многими инструментами, такими как diff, validator и т.д.

Ссылки:

143
ответ дан Pellared 16 авг. '11 в 12:25
источник поделиться

Вы можете использовать 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();
}

EDIT - Еще несколько ссылок:

96
ответ дан Panos 30 сент. '08 в 1:41
источник поделиться

Коммерческое решение, SpreadsheetGear для.NET, сделает это.

Вы можете увидеть живой ASP.NET (С# и VB) образцы здесь и скачать ознакомительную версию здесь.

Отказ от ответственности: у меня есть ООО "SpreadsheetGear"

74
ответ дан Joe Erickson 24 янв. '09 в 21:33
источник поделиться

Несколько вариантов, которые я использовал:

Если XLSX является обязательным: ExcelPackage - хороший старт, но он умер, когда разработчик прекратил работать над ним. ExML поднялся оттуда и добавил несколько функций. ExML не является плохим вариантом, я все еще использую его на нескольких веб-сайтах.

Тем не менее, для всех моих новых проектов я использую NPOI, порт.NET Apache POI. NPOI 2.0 (Alpha) также поддерживает XLSX.

57
ответ дан Nate 01 июня '09 в 18:45
источник поделиться

Очень легкая опция может заключаться в использовании таблиц HTML. Просто создайте теги head, body и table в файле и сохраните его как файл с расширением .xls. Существуют специальные атрибуты Microsoft, которые можно использовать для создания вывода, включая формулы.

Я понимаю, что вы не можете кодировать это в веб-приложении, но вот пример композиции файла Excel через HTML-таблица. Этот метод можно использовать, если вы кодировали консольное приложение, настольное приложение или службу.

55
ответ дан Forgotten Semicolon 30 сент. '08 в 1:37
источник поделиться

Вы можете использовать ExcelXmlWriter.

Он работает нормально.

43
ответ дан Petr Snobelt 12 февр. '09 в 18:04
источник поделиться

Вы действительно можете проверить классы взаимодействия. Вы не говорите OLE (что это не так), но классы взаимодействия очень просты в использовании.

Вы можете быть впечатлены, если вы их не пробовали.

Пожалуйста, будьте предупреждены о позиции Microsoft по этому вопросу:

Microsoft в настоящее время не рекомендует и не поддерживает автоматизацию приложений Microsoft Office от любого бездействия, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может проявлять нестабильное поведение и/или тупиковой ситуации, когда Office запущен в этой среде.

41
ответ дан GEOCHET 30 сент. '08 в 1:34
источник поделиться

Если вы создаете файлы Excel 2007/2010, попробуйте этот проект с открытым исходным кодом: https://github.com/closedxml/closedxml

Он обеспечивает объектно-ориентированный способ манипулирования файлами (аналогично VBA), не имея дело с проблемами XML-документов. Он может использоваться любым языком.NET, таким как С# и 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");
40
ответ дан Manuel 23 нояб. '10 в 19:33
источник поделиться

Здесь полностью бесплатная библиотека С#, которая позволяет экспортировать из DataSet, DataTable или List<> в подлинный файл Excel.xlsx Excel 2007. Использование библиотек OpenXML:

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

Полный исходный код предоставляется - бесплатно - вместе с инструкциями и демонстрационным приложением.

После добавления этого класса в приложение вы можете экспортировать свой DataSet в Excel только в одной строке кода:

CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");

Это не намного проще, чем это...

И это даже не требует наличия Excel на вашем сервере.

29
ответ дан Mike Gledhill 05 дек. '11 в 15:08
источник поделиться

Вы можете подумать о создании своих файлов, используя формат XML Spreadsheet 2003. Это простой XML-формат с использованием хорошо документированной схемы.

22
ответ дан Sam Warwick 30 сент. '08 в 4:16
источник поделиться

Syncfusion Essential XlsIO может это сделать. Он не зависит от офиса Microsoft, а также имеет определенную поддержку для разных платформ.

Пример кода:

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

19
ответ дан Davis Jebaraj 07 окт. '16 в 21:03
источник поделиться

Вы можете взглянуть на GemBox.Spreadsheet.

У них есть бесплатная версия со всеми функциями, но она ограничена до 150 строк на лист и 5 листов на книгу, если это подпадает под ваши потребности.

Мне еще не нужно было его использовать, но это интересно.

17
ответ дан ManiacZX 30 сент. '08 в 1:48
источник поделиться

OpenXML также является хорошей альтернативой, которая помогает избежать установки MS Excel на сервере. Open XML SDK 2.0, предоставляемый Microsoft, упрощает задачу управления пакетами Open XML и базовыми элементами схемы Open XML в пакете. Интерфейс прикладного программирования Open XML (API) инкапсулирует многие общие задачи, которые разработчики выполняют в пакетах Open XML.

Отметьте OpenXML: Альтернатива, которая помогает избежать установки MS Excel на сервере

13
ответ дан Sachin Dhir 02 дек. '15 в 16:30
источник поделиться

Различные библиотеки библиотек Office 2003 доступны для небольших файлов excel. Тем не менее, я считаю, что размер большой книги, сохраненной в формате XML, является проблемой. Например, рабочая книга, с которой я работаю, будет 40 МБ в новом (и, по общему признанию, более плотно упакованном) формате XLSX, станет файлом формата 360 МБ.

Что касается моих исследований, у меня есть два коммерческих пакета, которые позволяют выводить старые форматы двоичных файлов. Они есть:

Не дешево (500USD и 800USD соответственно, я думаю). но обе работают независимо от самого Excel.

Что мне будет интересно, так это модуль вывода Excel для подобных OpenOffice.org. Интересно, можно ли их портировать с Java на.Net.

13
ответ дан biozinc 24 нояб. '08 в 11:22
источник поделиться

Ну,

вы также можете использовать стороннюю библиотеку, например Aspose.

Эта библиотека имеет то преимущество, что на вашем компьютере не будет установлен Excel, который был бы идеальным в вашем случае.

13
ответ дан Dimi Toulakis 10 нояб. '09 в 8:05
источник поделиться

Просто хочу добавить другую ссылку на стороннее решение, которое напрямую решает вашу проблему: http://www.officewriter.com

(Отказ от ответственности: я работаю для SoftArtisans, компании, которая делает OfficeWriter)

13
ответ дан Eisbaer 23 авг. '11 в 19:52
источник поделиться

Я согласен с созданием XML-таблиц, вот пример того, как это сделать для С# 3 (все просто блоги об этом в VB 9: P) http://www.aaron-powell.com/linq-to-xml-to-excel

13
ответ дан Aaron Powell 30 сент. '08 в 6:53
источник поделиться

Я недавно использовал FlexCel.NET и нашел отличную библиотеку! Я не говорю о слишком многих программных продуктах. Не стоит указывать здесь весь объем продаж, вы можете прочитать все функции на своем веб-сайте.

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

Я не думаю, что вы найдете какой-либо способ сделать это без сторонних библиотек, поскольку.NET framework, очевидно, не поддерживает его, а OLE Automation - всего лишь целый мир боли.

11
ответ дан EMP 15 февр. '09 в 11:12
источник поделиться

Вы можете создавать красиво отформатированные файлы Excel с помощью этой библиотеки: http://officehelper.codeplex.com/documentation
Пример ниже:

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};
    }
}
11
ответ дан user529824 03 дек. '10 в 22:53
источник поделиться

Здесь можно сделать это с LINQ to XML, в комплекте с образцом кода:

Быстрый импорт и экспорт данных Excel с помощью LINQ to XML

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

(Также, конечно, это VB.NET, а не С#, но вы всегда можете изолировать материал VB.NET в своем собственном проекте, чтобы использовать XML-литералы и делать все остальное на С#.)

11
ответ дан Ryan Lundy 30 сент. '08 в 4:39
источник поделиться
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, который может помочь вам

11
ответ дан Gaurav 28 апр. '11 в 13:40
источник поделиться

Некоторые сторонние поставщики компонентов, такие как Infragistics или Syncfusion, обеспечивают очень хорошие возможности экспорта Excel, которые не требуют установки Microsoft Excel.

Поскольку эти поставщики также предоставляют расширенные компоненты сетки пользовательского интерфейса, эти компоненты особенно удобны, если вы хотите, чтобы стиль и макет экспорта excel имитировали текущее состояние сетки в пользовательском интерфейсе вашего приложения.

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

Ранее я участвовал в проектах, которые пытались использовать автоматизацию на стороне сервера в пакете Microsoft Office. Исходя из этого опыта, я бы настоятельно рекомендовал против такого подхода.

11
ответ дан Simen S 16 февр. '11 в 14:47
источник поделиться

IKVM + POI

Или вы могли бы использовать Interop...

11
ответ дан MagicKat 30 сент. '08 в 1:39
источник поделиться

Самый простой и быстрый способ создания файла Excel из С# - использовать инструмент производительности Open XML. Инструмент производительности Open XML поставляется с установкой Open XML SDK. Инструмент реверсирует любой файл Excel в код С#. Затем код С# можно использовать для повторного создания этого файла.

Обзор процесса:

  1. Установите SDK Open XML с помощью инструмента.
  2. Создайте файл Excel, используя последний клиент Excel с желаемым внешним видом. Назовите его DesiredLook.xlsx.
  3. С помощью инструмента откройте DesiredLook.xlsx и нажмите кнопку Reflect Code рядом с верхней. enter image description here
  4. Код С# для вашего файла будет создан в правой панели инструмента. Добавьте это в свое решение С# и создайте файлы с этим желаемым внешним видом.

В качестве бонуса этот метод работает для любых файлов Word и PowerPoint. Будучи разработчиком С#, вы вносите изменения в код в соответствии с вашими потребностями.

Я разработал простое приложение WPF для github, которое будет работать в Windows для этой цели. Существует класс-заполнитель под названием GeneratedClass который вы можете вставить сгенерированный код. Если вы вернетесь к одной версии файла, она будет генерировать файл excel следующим образом:

enter image description here

9
ответ дан Taterhead 28 февр. '17 в 2:30
источник поделиться

Некоторая полезная автоматизация Excel в С#, вы можете найти по следующей ссылке.

http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm

Болтона.

9
ответ дан user35711 10 нояб. '09 в 8:02
источник поделиться

Посмотрите образцы, как создавать файлы Excel.

Есть примеры в С# и VB.NET

Он управляет файлами XSL XSLX и CSV Excel.

http://www.devtriogroup.com/ExcelJetcell/Samples

8
ответ дан Bonnie Cornell 12 апр. '11 в 10:04
источник поделиться

Вы когда-нибудь пробовали sylk?

Мы использовали для создания excelsheets в классическом asp как sylk, и прямо сейчас мы ищем excelgenerater.

Преимущества для sylk заключаются в том, что вы можете отформатировать ячейки.

7
ответ дан Stefan Koelle 04 нояб. '08 в 23:15
источник поделиться
  • 1
  • 2

Другие вопросы по меткам