it-swarm.com.ru

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

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

1679
mistrmark

Вы можете использовать библиотеку под названием 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 Малая GPL
EPPlus - GNU Малая общедоступная лицензия (LGPL)
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, но вышеперечисленные функции меня поразили.

937
Mike Webb

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

528
Jan Källman

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

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

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

Посмотрите на мои сообщения в блоге:

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

НКОИ с таблицей Excel и динамической диаграммой

158
Leniel Maccaferri

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

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

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

Ссылки:

154
Pellared

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

РЕДАКТИРОВАТЬ - Еще несколько ссылок:

100
Panos

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

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

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

75
Joe Erickson

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

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

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

61
Nate

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

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

58
Forgotten Semicolon

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

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

44
Petr Snobelt

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

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

Пожалуйста, обратите внимание на stance Microsoft по этому вопросу:

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

42
GEOCHET

Если вы создаете файлы 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");
41
Manuel

Вот совершенно бесплатная библиотека C #, которая позволяет вам экспортировать из DataSet, DataTable или List<> в подлинный файл Excel 2007 .xlsx, используя библиотеки OpenXML:

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

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

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

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

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

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

30
Mike Gledhill

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

23
Sam Warwick

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

Пример кода:

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

18
Davis Jebaraj

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

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

Мне еще не приходилось пользоваться им, но выглядит интересно.

17
ManiacZX

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

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

14
Sachin Dhir

Что ж,

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

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

14
Dimi Takis

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

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

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

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

13
biozinc

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

13
Aaron Powell

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

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

12
Eisbaer

IKVM + POI

Или вы можете использовать Interop ...

11
MagicKat

Вот способ сделать это с помощью LINQ to XML, дополненный примером кода:

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

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

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

11
Ryan Lundy

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

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

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

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

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

11
Simen S
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

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

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

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

10
EMP

Я написал простой код для экспорта набора данных в 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();
    }
10
Harsha.Vaswani

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

Обзор вовлеченного процесса:

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

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

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

 enter image description here

9
Taterhead

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

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

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

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

8
Bonnie Cornell

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

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

болтон.

8
user35711

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

Раньше мы создавали листы Excel в классическом asp as sylk, и сейчас мы тоже ищем excelgenerater.

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

7
Stefan Koelle

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

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

4
Nick

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

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

http://www.extrememl.com/

4
Jens

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

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

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

3

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

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

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

Или еще проще, просто используйте ref lib MS Supplies - http://csharp.net-informations.com/Excel/csharp-create-Excel.htm

3
Craig Mc

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

Существует пример XML из Википедии .

3
ScaleOvenStove

Один очень простой вариант, который часто упускают из виду, - это создать отчет .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.

2
AlexDev

Некоторое время назад я создал 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
Vladimir Venegas

Если вы создаете таблицу данных или сетку данных из кода, вы можете сохранить все данные, используя этот простой метод. Этот метод не рекомендуется, но работает на 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!");
   }
1

проверить это не нужно для сторонних библиотек, вы можете просто экспортировать данные в файл 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();
0
Shubham

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

0
Vijay Dodamani