Как создать файл Excel (.XLS и .XLSX) в C # без установки MS Office?

1667

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

  • 0
    "... без установки MS Office?" часть вопроса звучит очень непрофессионально. Вы можете создать любой тип файла из программы на C # (одним из них является файл xls или xlsx ). Не обязательно, чтобы на вашем компьютере была программа, которая может читать ее (скажем, двоичную).
Теги:
excel
file-io

42 ответа

930
Лучший ответ

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

ExcelLibrary

Это выглядит как порт 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 Lesser General Public License (LGPL)
НКОИ - Лицензия 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 the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);

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

  • 221
    ExcelLibrary был заменен исключительным EPPlus - epplus.codeplex.com . Ян регулярно обновляет его. Я использовал его, и это один из лучших проектов с открытым исходным кодом, с которыми мы работали.
  • 1
    Следует отметить, что ExcelLibrary имеет много проблем с производительностью при работе с большими наборами данных (более 5000 строк с большим количеством столбцов). В настоящее время ведется серьезная модификация базы кода на работе, чтобы мы могли использовать ее в проекте.
Показать ещё 6 комментариев
523

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

  • 9
    Моя полностью бесплатная библиотека также позволяет вам экспортировать любой DataSet, DataTable или List <> непосредственно в файл Excel 2007 .xlsx, используя Open XML. Полный исходный код и демонстрационная версия доступны здесь: mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm
  • 68
    Лицензия теперь LGPL, примечания к выпуску здесь: epplus.codeplex.com/releases/view/79802
Показать ещё 4 комментария
159

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

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

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

Ссылки:

  • 2
    Важно отметить, что DLL для этого составляет чуть более 5 МБ и ограничивается форматами Office 2007. Но, безусловно, самое простое и быстрое решение, которое работает для меня.
  • 11
    Просто один на один, что v2.5 отсутствует и может быть загружен здесь .
Показать ещё 4 комментария
156

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

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

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

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

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

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

  • 5
    Примечание к NPOI - ссылки на строки и столбцы начинаются с нуля. Хорошо работает для заполнения существующего шаблона.
95

Вы можете использовать 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 - Еще несколько ссылок:

  • 3
    Может кто-нибудь подтвердить, работает ли это при работе в x64? Я уверен, что Jet работает, только если ваше приложение скомпилировано или работает в 32-битном режиме.
  • 1
    Я только что проверил это соединение, и оно не установилось на Windows Server 2008 R2 x64 RC. Кажется, нужно установить драйвер системы Office 2007: компоненты для подключения к данным [ microsoft.com/downloads/…
Показать ещё 5 комментариев
79

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

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

Отказ от ответственности: я владею SpreadsheetGear LLC

  • 6
    У вас отличный продукт, но я думаю, что многие люди ждут бесплатных решений. Это может объяснить отрицательные голоса.
61

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

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

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

  • 0
    Будьте осторожны с ExcelPackage, если вам нужна поддержка XLS. Мне было трудно с этим и в конечном итоге переключился на ExcelLibrary.
  • 0
    Определенно верно. ExcelPackage / ExML - хороший вариант, только если вам нужна поддержка XLSX.
Показать ещё 1 комментарий
56

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

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

  • 5
    Он такой специальный, но он работает (не говоря уже о выдаче предупреждения об открытии) и настолько прост, что заслуживает того, чтобы найти решение. Хотя только для того, чтобы показать, что вы можете экспортировать файл Excel :))
  • 2
    Это решение отлично сработало для меня, но учтите, что вы не можете использовать расширение .xlsx.
Показать ещё 1 комментарий
47

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

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

43

Если вы создаете файлы 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");
  • 9
    Я попытался использовать это в проекте, который создает довольно большие листы Excel. Отличная библиотека, но крайне плохая производительность. Я только что сделал сравнение для проекта, над которым я работаю: ClosedXML (v 0.53.3) занял 92 489 мс, а EPPlus (v 2.9.03, для тестирования - мы не можем использовать, потому что это GPL) - 16 500 мс.
  • 1
    @ Друид - лицензия LGPL, при условии, что вы не измените исходный код на ClosedXML, он может свободно использовать epplus.codeplex.com/license
40

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

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

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

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

  • 5
    Но вы должны убедиться, что вы утилизируете все вручную, иначе вы потеряете память
  • 6
    @ Рики Б: Кроме того, по моему опыту с взаимодействием, он использует Excel. Каждый раз, когда мы использовали его, если Excel не был установлен на машине, мы получали исключения COM.
Показать ещё 4 комментария
31

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

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

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

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

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

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

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

  • 0
    Это немного вводит в заблуждение, так как вы просите пожертвования, чтобы получить все функции.
  • 0
    Это отчасти верно: полностью бесплатная версия сгенерирует идеальный файл .xlsx для вас, и весь исходный код предоставлен. Если вы пожертвуете 10 или более долларов одной из этих двух благотворительных организаций (из которых я ничего не получаю), вы получите «лучшую» версию, показывающую, как выполнять форматирование, даты и т. Д. Учитывая стоимость сторонних продуктов, я считаю, пожертвование 10 долларов на благое дело вместо этого стоит того!
Показать ещё 1 комментарий
24

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

19

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.

17

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

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

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

14

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

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

14

Ну,

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

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

  • 0
    Чтобы быть более точным, вы можете использовать Aspose.Cells для .NET для создания файлов Excel (XLS, XLSX) в вашем приложении .NET.
  • 6
    Да, вы можете, если не возражаете заплатить минимальный лицензионный сбор в размере 999 долларов. Попробуйте библиотеку MikesKnowledgeBase ... которая на $ 999 дешевле, чем эта !!
13

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

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

13

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

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

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

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

  • 0
    Этот работает как на .net и Java, и не дорогой. SmartXLS smartxls.com
13

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

11
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, который может помочь вам

  • 7
    Нет, это генерирует HTML, помеченный как файл Excel, а не как настоящий файл Excel. Да, сам Excel откроет это ОК, но другие программы, использующие электронные таблицы, включая, например, бесплатное средство просмотра Microsoft Excel, не примут его. Вам бы лучше создать настоящий файл Excel, используя одну из библиотек здесь.
  • 0
    Вам также следует использовать System.Net.Mime.ContentDisposition для генерации текста заголовка размещения содержимого, а не для добавления строки - это будет корректно работать с именами файлов, содержащими пробелы и т. Д.
11

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

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

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

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

11

Вы можете создавать красиво отформатированные файлы 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

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

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

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

11

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

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

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

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

11

IKVM + POI

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

9

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

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

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

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

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

Изображение 947

  • 0
    Я еще не пробовал это решение Open XML SDK, но я обязательно его проверю. Я работал с такими инструментами много лет и не знал об этом. Я опубликовал свой собственный простой FOSS для преобразования файлов в XLSX с помощью .NET: github.com/TonyGravagno/NebulaXConvert
9

Я написал простой код для экспорта набора данных для 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();
    }
  • 1
    Как говорится в статье, это XML, который Excel будет читать, а не файл XLS, а это значит, что он может работать только в Excel, а не в других программах, которые читают электронные таблицы. Но это, вероятно, лучше, чем ответы в эквивалентной таблице HTML!
  • 0
    Поддерживает xlsx ? OpenXML ?
9

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

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

Болтона.

8

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

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

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

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

7

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

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

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

4

Найдите ExtremeML. Это довольно классная библиотека, которая позволяет вам использовать формат OpenXML для генерации файлов OpenXML.

Это также проект OpenSource.

http://www.extrememl.com/

  • 0
    Ссылка кажется мертвой
4

Java с открытым исходным кодом - Apache POI. Может быть, есть способ настроить interop здесь, но я не знаю достаточно о Java, чтобы ответить на это.

Когда я исследовал эту проблему, я закончил использование сборок Interop.

3

http://www.codeproject.com/KB/cs/Excel_and_C_.aspx <= почему бы просто не использовать встроенные возможности окон, просто установить офис на сервере, любое приложение, которое вы установка может быть автоматизирована.

Намного проще использовать собственные методы.

Если он установлен, вы можете использовать его, это самая удивительная и используемая функция в окнах, в которую она была перезаписана COM в старые добрые времена, и это экономит вам массу времени и боли.

Или даже проще просто использовать поставки ref lib MS - http://csharp.net-informations.com/excel/csharp-create-excel.htm

  • 0
    Почему второй способ проще? Разве это не то же самое (добавление библиотеки нативных объектов в ваш проект)? Вам нужно установить Excel, чтобы эта библиотека объектов работала?
  • 6
    Microsoft не рекомендует и не поддерживает автоматизацию Office из неинтерактивных приложений, таких как ASP.NET. См. Support.microsoft.com/kb/257757
Показать ещё 1 комментарий
3

Я также проголосую за GemBox.Spreadsheet.

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

Принимал мои задачи отчетности на совершенно новом уровне скорости выполнения.

2

Один очень простой вариант, который часто упускается из виду, - создать отчет.rdlc с помощью Microsoft Reporting и экспортировать его в формат excel. Вы можете создать его в визуальной студии и сгенерировать файл, используя:

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.

2

Вы можете просто записать его в XML, используя формат Excel XML, и назовите его расширением.XLS, и он откроется с помощью excel. Вы можете управлять всем форматированием (жирным шрифтом, шириной и т.д.) В заголовке файла XML.

В Википедии есть пример XML.

  • 3
    Это круто, за исключением того, что он не поддерживает диаграммы или изображения.
1

Некоторое время назад я создал DLL поверх NPOI. Это очень простое использование:

IList<DummyPerson> dummyPeople = new List<DummyPerson>();
//Add data to dummyPeople...
IExportEngine engine = new ExcelExportEngine();
engine.AddData(dummyPeople); 
MemoryStream memory = engine.Export();

Вы можете прочитать об этом на здесь.

Кстати, это 100% открытый источник. Не стесняйтесь использовать, редактировать и делиться;)

1

Если вы делаете таблицу данных или 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!");
   }
0

проверить это не нужно для сторонних библиотек, вы можете просто экспортировать данные в файл 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();
  • 1
    Это создает файл с разделителями табуляции и сохраняет его с расширением .XLS, чтобы он открывался в Excel. Это не настоящий файл Excel, и вы не можете включить форматирование и т. Д. Здесь есть аналогичные ответы, в которых используется тот же трюк с HTML и неправильным расширением.
0

Чтобы сохранить 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

Для SaveAs в разных форматах файлов вы можете обратиться к xlFileFormat

-5

Я использую следующий код для создания файла excel 2007, который создает файл и записывает его в этот файл, но когда я открываю файл, но он дает мне ошибку, exel не может открыть файл bcz файл может быть coruupted или расширение файла несовместимо. но если я использовал .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

  • 1
    Это все зависит от вашего класса Contact , и вы не сказали нам, что это такое. Если это работает для xls, то, скорее всего, вы пишете HTML, который не является настоящим файлом Excel. А ваша ссылка использует взаимодействие, которое, как упоминалось выше, не должно использоваться на стороне сервера и может медленно заполнять большие таблицы.
  • 1
    Contact - связанный список, а не class.declare linkledist и использовал его, потому что я не знаю размер данных, поэтому я использовал связанный список.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню