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

avatar
mistrmark
29 сентября 2008 в 22:30
1196418
46
2014

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

Источник
Tony
2 апреля 2019 в 15:02
48

@Mike Фрагмент "без установки Excel" не имеет ничего общего с профессионализмом. Это о зависимостях. Исходный текст вопроса был сформулирован следующим образом: ​​«В идеале я хотел бы иметь открытый исходный код, поэтому мне не нужно добавлять какие-либо сторонние зависимости в свой код, и я бы не хотел напрямую использовать Excel для создания файла. (с использованием OLE Automation.) « К сожалению, вопрос был значительно упрощен.

Alexander Ryan Baggett
13 августа 2019 в 21:37
6

Предполагая, что вы пытались сделать что-то без библиотеки или внешнего кода, я не могу говорить о файле xls, но для файлов xlsx почему бы не начать с того, чтобы взять существующий, переименовать его в zip-файл и изучить его содержимое? Немногое реверс-инжиниринга многое вам расскажет. В разных папках и подпапках есть несколько разных XML-файлов и файлов rels. Попробуйте изучить это и посмотреть, можно ли это воспроизвести, или посмотрите, сможете ли вы найти документацию по различным пространствам имен / схемам xml.

Ответы (46)

avatar
Mike Webb
18 июня 2020 в 17:33
1114

Вы можете использовать библиотеку под названием 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
<67867760> LG11767760> - Больше не поддерживается
EPPlus 5 - Некоммерческая лицензия Polyform - Начиная с мая 2020 года <678677856011851> NP
> <678676011850> NPPlus867867760118675

Вот пример кода для 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 вручную, но меня действительно впечатлила вышеуказанная функциональность.

Mark A
4 ноября 2010 в 00:11
254

ExcelLibrary был заменен исключительным EPPlus - epplus.codeplex.com. Ян регулярно обновляет его. Мы использовали его, и это один из лучших проектов с открытым исходным кодом, с которыми мы работали.

rossisdead
18 октября 2011 в 23:17
3

Следует отметить, что ExcelLibrary имеет множество проблем с производительностью при работе с большими наборами данных (более 5000 строк с большим количеством столбцов). В настоящее время выполняется серьезная модификация базы кода, чтобы мы могли использовать ее в проекте.

Seth
26 января 2012 в 23:21
0

EPPlus кажется гораздо менее глючным, чем ExcelLibrary, НО это GPL и, следовательно, только решение для проектов с открытым исходным кодом.

Beep beep
27 января 2015 в 20:48
0

EPPlus фактически по-прежнему технически GPL, потому что это производная работа (т. Е. Кодовая база по-прежнему основана на ExcelLibrary, и, поскольку это GPL, то же самое и EPPlus ... вы не можете внести некоторые изменения в код GPL и использовать лицензию LGPL. в теме). Кто-нибудь знает, как писать в Excel, используя коммерческий код или истинный LGPL (или аналогичный лицензионный код).

Chris
28 октября 2015 в 15:06
0

ExcelLibrary больше не работает. Если вы хотите писать файлы Excel 2003 (.xls), эта библиотека отлично работает: CSharpJExcel sourceforge.net/projects/jexcelapi Не забудьте загрузить порт C #.

Amadeus Sánchez
30 ноября 2015 в 18:10
9

А как насчет ClosedXML? Я могу оказаться полезным в ваших проектах.

Kiquenet
15 июля 2016 в 11:44
0

Может быть, aspose.com/products/cells или gemboxsoftware.com/spreadsheet/overview

Vega4
28 апреля 2020 в 12:41
1

Я попробовал ExcelLibrary, все, что он мог сделать, это создать «поврежденный файл», ничего особенного, всего 3 столбца, небольшой файл. Excel 2016 не открывался. Пробовал автоматическое создание файлов ROM DataTable.

Britt Kelly
18 июня 2020 в 17:34
0

EPPlus - это LGPL до версии 5. Если вы используете в своем коде версию 5 или выше, будет создано исключение, если у вас нет лицензионного ключа.

avatar
user10186832
20 января 2022 в 10:32
0

Вот самый простой способ создать файл Excel.

Файлы Excel с расширением .xlsx представляют собой сжатые папки, содержащие файлы .XML, но сложные.

Сначала создайте структуру папок следующим образом -

public class CreateFileOrFolder
{
    static void Main()
    {
        //
        // https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-create-a-file-or-folder
        //
        // https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-write-to-a-text-file
        //
        // .NET Framework 4.7.2
        //
        // Specify a name for your top-level folder.
        string folderName = @"C:\Users\david\Desktop\Book3";

        // To create a string that specifies the path to a subfolder under your
        // top-level folder, add a name for the subfolder to folderName.

        string pathString = System.IO.Path.Combine(folderName, "_rels");
        System.IO.Directory.CreateDirectory(pathString);
        pathString = System.IO.Path.Combine(folderName, "docProps");
        System.IO.Directory.CreateDirectory(pathString);
        pathString = System.IO.Path.Combine(folderName, "xl");
        System.IO.Directory.CreateDirectory(pathString);

        string subPathString = System.IO.Path.Combine(pathString, "_rels");
        System.IO.Directory.CreateDirectory(subPathString);
        subPathString = System.IO.Path.Combine(pathString, "theme");
        System.IO.Directory.CreateDirectory(subPathString);
        subPathString = System.IO.Path.Combine(pathString, "worksheets");
        System.IO.Directory.CreateDirectory(subPathString);
        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}

Далее создайте текстовые файлы для хранения XML, необходимого для описания электронной таблицы Excel.

namespace MakeFiles3
{
    class Program
    {
        static void Main(string[] args)
        {
            //
            // https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-write-to-a-text-file
            //
            // .NET Framework 4.7.2
            //
            string fileName = @"C:\Users\david\Desktop\Book3\_rels\.rels";
            fnWriteFile(fileName);
            fileName = @"C:\Users\david\Desktop\Book3\docProps\app.xml";
            fnWriteFile(fileName);
            fileName = @"C:\Users\david\Desktop\Book3\docProps\core.xml";
            fnWriteFile(fileName);
            fileName = @"C:\Users\david\Desktop\Book3\xl\_rels\workbook.xml.rels";
            fnWriteFile(fileName);
            fileName = @"C:\Users\david\Desktop\Book3\xl\theme\theme1.xml";
            fnWriteFile(fileName);
            fileName = @"C:\Users\david\Desktop\Book3\xl\worksheets\sheet1.xml";
            fnWriteFile(fileName);
            fileName = @"C:\Users\david\Desktop\Book3\xl\styles.xml";
            fnWriteFile(fileName);
            fileName = @"C:\Users\david\Desktop\Book3\xl\workbook.xml";
            fnWriteFile(fileName);
            fileName = @"C:\Users\david\Desktop\Book3\[Content_Types].xml";
            fnWriteFile(fileName);
            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();

            bool fnWriteFile(string strFilePath)
            {
                if (!System.IO.File.Exists(strFilePath))
                {
                    using (System.IO.FileStream fs = System.IO.File.Create(strFilePath))
                    {
                        return true;
                    }
                }
                else
                {
                    System.Console.WriteLine("File \"{0}\" already exists.", strFilePath);
                    return false;
                }
            }
        }
    }
}

Затем заполните текстовые файлы XML.

Требуемый XML-код довольно подробный, поэтому вам может понадобиться использовать этот репозиторий github.

https://github.com/DaveTallett26/MakeFiles4/blob/master/MakeFiles4/Program.cs

//
// https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-write-text-to-a-file
// .NET Framework 4.7.2
//
using System.IO;

namespace MakeFiles4
{
    class Program
    {
        static void Main(string[] args)
        {
            string xContents = @"a";
            string xFilename = @"a";
            xFilename = @"C:\Users\david\Desktop\Book3\[Content_Types].xml";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><Types xmlns=""http://schemas.openxmlformats.org/package/2006/content-types""><Default Extension=""rels"" ContentType=""application/vnd.openxmlformats-package.relationships+xml""/><Default Extension=""xml"" ContentType=""application/xml""/><Override PartName=""/xl/workbook.xml"" ContentType=""application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml""/><Override PartName=""/xl/worksheets/sheet1.xml"" ContentType=""application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml""/><Override PartName=""/xl/theme/theme1.xml"" ContentType=""application/vnd.openxmlformats-officedocument.theme+xml""/><Override PartName=""/xl/styles.xml"" ContentType=""application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml""/><Override PartName=""/docProps/core.xml"" ContentType=""application/vnd.openxmlformats-package.core-properties+xml""/><Override PartName=""/docProps/app.xml"" ContentType=""application/vnd.openxmlformats-officedocument.extended-properties+xml""/></Types>";
            StartExstream(xContents, xFilename);

            xFilename = @"C:\Users\david\Desktop\Book3\_rels\.rels";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><Relationships xmlns=""http://schemas.openxmlformats.org/package/2006/relationships""><Relationship Id=""rId3"" Type=""http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"" Target=""docProps/app.xml""/><Relationship Id=""rId2"" Type=""http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"" Target=""docProps/core.xml""/><Relationship Id=""rId1"" Type=""http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"" Target=""xl/workbook.xml""/></Relationships>";
            StartExstream(xContents, xFilename);

            xFilename = @"C:\Users\david\Desktop\Book3\docProps\app.xml";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><Properties xmlns=""http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"" xmlns:vt=""http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes""><Application>Microsoft Excel</Application><DocSecurity>0</DocSecurity><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size=""2"" baseType=""variant""><vt:variant><vt:lpstr>Worksheets</vt:lpstr></vt:variant><vt:variant><vt:i4>1</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size=""1"" baseType=""lpstr""><vt:lpstr>Sheet1</vt:lpstr></vt:vector></TitlesOfParts><Company></Company><LinksUpToDate>false</LinksUpToDate><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>16.0300</AppVersion></Properties>";
            StartExstream(xContents, xFilename);

            xFilename = @"C:\Users\david\Desktop\Book3\docProps\core.xml";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><cp:coreProperties xmlns:cp=""http://schemas.openxmlformats.org/package/2006/metadata/core-properties"" xmlns:dc=""http://purl.org/dc/elements/1.1/"" xmlns:dcterms=""http://purl.org/dc/terms/"" xmlns:dcmitype=""http://purl.org/dc/dcmitype/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""><dc:creator>David Tallett</dc:creator><cp:lastModifiedBy>David Tallett</cp:lastModifiedBy><dcterms:created xsi:type=""dcterms:W3CDTF"">2021-10-26T15:47:15Z</dcterms:created><dcterms:modified xsi:type=""dcterms:W3CDTF"">2021-10-26T15:47:35Z</dcterms:modified></cp:coreProperties>";
            StartExstream(xContents, xFilename);

            xFilename = @"C:\Users\david\Desktop\Book3\xl\styles.xml";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><styleSheet xmlns=""http://schemas.openxmlformats.org/spreadsheetml/2006/main"" xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006"" mc:Ignorable=""x14ac x16r2 xr"" xmlns:x14ac=""http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"" xmlns:x16r2=""http://schemas.microsoft.com/office/spreadsheetml/2015/02/main"" xmlns:xr=""http://schemas.microsoft.com/office/spreadsheetml/2014/revision""><fonts count=""1"" x14ac:knownFonts=""1""><font><sz val=""11""/><color theme=""1""/><name val=""Calibri""/><family val=""2""/><scheme val=""minor""/></font></fonts><fills count=""2""><fill><patternFill patternType=""none""/></fill><fill><patternFill patternType=""gray125""/></fill></fills><borders count=""1""><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellStyleXfs count=""1""><xf numFmtId=""0"" fontId=""0"" fillId=""0"" borderId=""0""/></cellStyleXfs><cellXfs count=""1""><xf numFmtId=""0"" fontId=""0"" fillId=""0"" borderId=""0"" xfId=""0""/></cellXfs><cellStyles count=""1""><cellStyle name=""Normal"" xfId=""0"" builtinId=""0""/></cellStyles><dxfs count=""0""/><tableStyles count=""0"" defaultTableStyle=""TableStyleMedium2"" defaultPivotStyle=""PivotStyleLight16""/><extLst><ext uri=""{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}"" xmlns:x14=""http://schemas.microsoft.com/office/spreadsheetml/2009/9/main""><x14:slicerStyles defaultSlicerStyle=""SlicerStyleLight1""/></ext><ext uri=""{9260A510-F301-46a8-8635-F512D64BE5F5}"" xmlns:x15=""http://schemas.microsoft.com/office/spreadsheetml/2010/11/main""><x15:timelineStyles defaultTimelineStyle=""TimeSlicerStyleLight1""/></ext></extLst></styleSheet>";
            StartExstream(xContents, xFilename);

            xFilename = @"C:\Users\david\Desktop\Book3\xl\workbook.xml";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><workbook xmlns=""http://schemas.openxmlformats.org/spreadsheetml/2006/main"" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships"" xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006"" mc:Ignorable=""x15 xr xr6 xr10 xr2"" xmlns:x15=""http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"" xmlns:xr=""http://schemas.microsoft.com/office/spreadsheetml/2014/revision"" xmlns:xr6=""http://schemas.microsoft.com/office/spreadsheetml/2016/revision6"" xmlns:xr10=""http://schemas.microsoft.com/office/spreadsheetml/2016/revision10"" xmlns:xr2=""http://schemas.microsoft.com/office/spreadsheetml/2015/revision2""><fileVersion appName=""xl"" lastEdited=""7"" lowestEdited=""7"" rupBuild=""24430""/><workbookPr defaultThemeVersion=""166925""/><mc:AlternateContent xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006""><mc:Choice Requires=""x15""><x15ac:absPath url=""C:\Users\david\Desktop\"" xmlns:x15ac=""http://schemas.microsoft.com/office/spreadsheetml/2010/11/ac""/></mc:Choice></mc:AlternateContent><xr:revisionPtr revIDLastSave=""0"" documentId=""8_{C633700D-2D40-49EE-8C5E-2561E28A6758}"" xr6:coauthVersionLast=""47"" xr6:coauthVersionMax=""47"" xr10:uidLastSave=""{00000000-0000-0000-0000-000000000000}""/><bookViews><workbookView xWindow=""-120"" yWindow=""-120"" windowWidth=""29040"" windowHeight=""15840"" xr2:uid=""{934C5B62-1DC1-4322-BAE8-00D615BD2FB3}""/></bookViews><sheets><sheet name=""Sheet1"" sheetId=""1"" r:id=""rId1""/></sheets><calcPr calcId=""191029""/><extLst><ext uri=""{140A7094-0E35-4892-8432-C4D2E57EDEB5}"" xmlns:x15=""http://schemas.microsoft.com/office/spreadsheetml/2010/11/main""><x15:workbookPr chartTrackingRefBase=""1""/></ext><ext uri=""{B58B0392-4F1F-4190-BB64-5DF3571DCE5F}"" xmlns:xcalcf=""http://schemas.microsoft.com/office/spreadsheetml/2018/calcfeatures""><xcalcf:calcFeatures><xcalcf:feature name=""microsoft.com:RD""/><xcalcf:feature name=""microsoft.com:Single""/><xcalcf:feature name=""microsoft.com:FV""/><xcalcf:feature name=""microsoft.com:CNMTM""/><xcalcf:feature name=""microsoft.com:LET_WF""/></xcalcf:calcFeatures></ext></extLst></workbook>";
            StartExstream(xContents, xFilename);

            xFilename = @"C:\Users\david\Desktop\Book3\xl\_rels\workbook.xml.rels";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><Relationships xmlns=""http://schemas.openxmlformats.org/package/2006/relationships""><Relationship Id=""rId3"" Type=""http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"" Target=""styles.xml""/><Relationship Id=""rId2"" Type=""http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"" Target=""theme/theme1.xml""/><Relationship Id=""rId1"" Type=""http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"" Target=""worksheets/sheet1.xml""/></Relationships>";
            StartExstream(xContents, xFilename);

            xFilename = @"C:\Users\david\Desktop\Book3\xl\theme\theme1.xml";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><a:theme xmlns:a=""http://schemas.openxmlformats.org/drawingml/2006/main"" name=""Office Theme""><a:themeElements><a:clrScheme name=""Office""><a:dk1><a:sysClr val=""windowText"" lastClr=""000000""/></a:dk1><a:lt1><a:sysClr val=""window"" lastClr=""FFFFFF""/></a:lt1><a:dk2><a:srgbClr val=""44546A""/></a:dk2><a:lt2><a:srgbClr val=""E7E6E6""/></a:lt2><a:accent1><a:srgbClr val=""4472C4""/></a:accent1><a:accent2><a:srgbClr val=""ED7D31""/></a:accent2><a:accent3><a:srgbClr val=""A5A5A5""/></a:accent3><a:accent4><a:srgbClr val=""FFC000""/></a:accent4><a:accent5><a:srgbClr val=""5B9BD5""/></a:accent5><a:accent6><a:srgbClr val=""70AD47""/></a:accent6><a:hlink><a:srgbClr val=""0563C1""/></a:hlink><a:folHlink><a:srgbClr val=""954F72""/></a:folHlink></a:clrScheme><a:fontScheme name=""Office""><a:majorFont><a:latin typeface=""Calibri Light"" panose=""020F0302020204030204""/><a:ea typeface=""""/><a:cs typeface=""""/><a:font script=""Jpan"" typeface=""游ゴシック Light""/><a:font script=""Hang"" typeface=""맑은 고딕""/><a:font script=""Hans"" typeface=""等线 Light""/><a:font script=""Hant"" typeface=""新細明體""/><a:font script=""Arab"" typeface=""Times New Roman""/><a:font script=""Hebr"" typeface=""Times New Roman""/><a:font script=""Thai"" typeface=""Tahoma""/><a:font script=""Ethi"" typeface=""Nyala""/><a:font script=""Beng"" typeface=""Vrinda""/><a:font script=""Gujr"" typeface=""Shruti""/><a:font script=""Khmr"" typeface=""MoolBoran""/><a:font script=""Knda"" typeface=""Tunga""/><a:font script=""Guru"" typeface=""Raavi""/><a:font script=""Cans"" typeface=""Euphemia""/><a:font script=""Cher"" typeface=""Plantagenet Cherokee""/><a:font script=""Yiii"" typeface=""Microsoft Yi Baiti""/><a:font script=""Tibt"" typeface=""Microsoft Himalaya""/><a:font script=""Thaa"" typeface=""MV Boli""/><a:font script=""Deva"" typeface=""Mangal""/><a:font script=""Telu"" typeface=""Gautami""/><a:font script=""Taml"" typeface=""Latha""/><a:font script=""Syrc"" typeface=""Estrangelo Edessa""/><a:font script=""Orya"" typeface=""Kalinga""/><a:font script=""Mlym"" typeface=""Kartika""/><a:font script=""Laoo"" typeface=""DokChampa""/><a:font script=""Sinh"" typeface=""Iskoola Pota""/><a:font script=""Mong"" typeface=""Mongolian Baiti""/><a:font script=""Viet"" typeface=""Times New Roman""/><a:font script=""Uigh"" typeface=""Microsoft Uighur""/><a:font script=""Geor"" typeface=""Sylfaen""/><a:font script=""Armn"" typeface=""Arial""/><a:font script=""Bugi"" typeface=""Leelawadee UI""/><a:font script=""Bopo"" typeface=""Microsoft JhengHei""/><a:font script=""Java"" typeface=""Javanese Text""/><a:font script=""Lisu"" typeface=""Segoe UI""/><a:font script=""Mymr"" typeface=""Myanmar Text""/><a:font script=""Nkoo"" typeface=""Ebrima""/><a:font script=""Olck"" typeface=""Nirmala UI""/><a:font script=""Osma"" typeface=""Ebrima""/><a:font script=""Phag"" typeface=""Phagspa""/><a:font script=""Syrn"" typeface=""Estrangelo Edessa""/><a:font script=""Syrj"" typeface=""Estrangelo Edessa""/><a:font script=""Syre"" typeface=""Estrangelo Edessa""/><a:font script=""Sora"" typeface=""Nirmala UI""/><a:font script=""Tale"" typeface=""Microsoft Tai Le""/><a:font script=""Talu"" typeface=""Microsoft New Tai Lue""/><a:font script=""Tfng"" typeface=""Ebrima""/></a:majorFont><a:minorFont><a:latin typeface=""Calibri"" panose=""020F0502020204030204""/><a:ea typeface=""""/><a:cs typeface=""""/><a:font script=""Jpan"" typeface=""游ゴシック""/><a:font script=""Hang"" typeface=""맑은 고딕""/><a:font script=""Hans"" typeface=""等线""/><a:font script=""Hant"" typeface=""新細明體""/><a:font script=""Arab"" typeface=""Arial""/><a:font script=""Hebr"" typeface=""Arial""/><a:font script=""Thai"" typeface=""Tahoma""/><a:font script=""Ethi"" typeface=""Nyala""/><a:font script=""Beng"" typeface=""Vrinda""/><a:font script=""Gujr"" typeface=""Shruti""/><a:font script=""Khmr"" typeface=""DaunPenh""/><a:font script=""Knda"" typeface=""Tunga""/><a:font script=""Guru"" typeface=""Raavi""/><a:font script=""Cans"" typeface=""Euphemia""/><a:font script=""Cher"" typeface=""Plantagenet Cherokee""/><a:font script=""Yiii"" typeface=""Microsoft Yi Baiti""/><a:font script=""Tibt"" typeface=""Microsoft Himalaya""/><a:font script=""Thaa"" typeface=""MV Boli""/><a:font script=""Deva"" typeface=""Mangal""/><a:font script=""Telu"" typeface=""Gautami""/><a:font script=""Taml"" typeface=""Latha""/><a:font script=""Syrc"" typeface=""Estrangelo Edessa""/><a:font script=""Orya"" typeface=""Kalinga""/><a:font script=""Mlym"" typeface=""Kartika""/><a:font script=""Laoo"" typeface=""DokChampa""/><a:font script=""Sinh"" typeface=""Iskoola Pota""/><a:font script=""Mong"" typeface=""Mongolian Baiti""/><a:font script=""Viet"" typeface=""Arial""/><a:font script=""Uigh"" typeface=""Microsoft Uighur""/><a:font script=""Geor"" typeface=""Sylfaen""/><a:font script=""Armn"" typeface=""Arial""/><a:font script=""Bugi"" typeface=""Leelawadee UI""/><a:font script=""Bopo"" typeface=""Microsoft JhengHei""/><a:font script=""Java"" typeface=""Javanese Text""/><a:font script=""Lisu"" typeface=""Segoe UI""/><a:font script=""Mymr"" typeface=""Myanmar Text""/><a:font script=""Nkoo"" typeface=""Ebrima""/><a:font script=""Olck"" typeface=""Nirmala UI""/><a:font script=""Osma"" typeface=""Ebrima""/><a:font script=""Phag"" typeface=""Phagspa""/><a:font script=""Syrn"" typeface=""Estrangelo Edessa""/><a:font script=""Syrj"" typeface=""Estrangelo Edessa""/><a:font script=""Syre"" typeface=""Estrangelo Edessa""/><a:font script=""Sora"" typeface=""Nirmala UI""/><a:font script=""Tale"" typeface=""Microsoft Tai Le""/><a:font script=""Talu"" typeface=""Microsoft New Tai Lue""/><a:font script=""Tfng"" typeface=""Ebrima""/></a:minorFont></a:fontScheme><a:fmtScheme name=""Office""><a:fillStyleLst><a:solidFill><a:schemeClr val=""phClr""/></a:solidFill><a:gradFill rotWithShape=""1""><a:gsLst><a:gs pos=""0""><a:schemeClr val=""phClr""><a:lumMod val=""110000""/><a:satMod val=""105000""/><a:tint val=""67000""/></a:schemeClr></a:gs><a:gs pos=""50000""><a:schemeClr val=""phClr""><a:lumMod val=""105000""/><a:satMod val=""103000""/><a:tint val=""73000""/></a:schemeClr></a:gs><a:gs pos=""100000""><a:schemeClr val=""phClr""><a:lumMod val=""105000""/><a:satMod val=""109000""/><a:tint val=""81000""/></a:schemeClr></a:gs></a:gsLst><a:lin ang=""5400000"" scaled=""0""/></a:gradFill><a:gradFill rotWithShape=""1""><a:gsLst><a:gs pos=""0""><a:schemeClr val=""phClr""><a:satMod val=""103000""/><a:lumMod val=""102000""/><a:tint val=""94000""/></a:schemeClr></a:gs><a:gs pos=""50000""><a:schemeClr val=""phClr""><a:satMod val=""110000""/><a:lumMod val=""100000""/><a:shade val=""100000""/></a:schemeClr></a:gs><a:gs pos=""100000""><a:schemeClr val=""phClr""><a:lumMod val=""99000""/><a:satMod val=""120000""/><a:shade val=""78000""/></a:schemeClr></a:gs></a:gsLst><a:lin ang=""5400000"" scaled=""0""/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=""6350"" cap=""flat"" cmpd=""sng"" algn=""ctr""><a:solidFill><a:schemeClr val=""phClr""/></a:solidFill><a:prstDash val=""solid""/><a:miter lim=""800000""/></a:ln><a:ln w=""12700"" cap=""flat"" cmpd=""sng"" algn=""ctr""><a:solidFill><a:schemeClr val=""phClr""/></a:solidFill><a:prstDash val=""solid""/><a:miter lim=""800000""/></a:ln><a:ln w=""19050"" cap=""flat"" cmpd=""sng"" algn=""ctr""><a:solidFill><a:schemeClr val=""phClr""/></a:solidFill><a:prstDash val=""solid""/><a:miter lim=""800000""/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=""57150"" dist=""19050"" dir=""5400000"" algn=""ctr"" rotWithShape=""0""><a:srgbClr val=""000000""><a:alpha val=""63000""/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=""phClr""/></a:solidFill><a:solidFill><a:schemeClr val=""phClr""><a:tint val=""95000""/><a:satMod val=""170000""/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=""1""><a:gsLst><a:gs pos=""0""><a:schemeClr val=""phClr""><a:tint val=""93000""/><a:satMod val=""150000""/><a:shade val=""98000""/><a:lumMod val=""102000""/></a:schemeClr></a:gs><a:gs pos=""50000""><a:schemeClr val=""phClr""><a:tint val=""98000""/><a:satMod val=""130000""/><a:shade val=""90000""/><a:lumMod val=""103000""/></a:schemeClr></a:gs><a:gs pos=""100000""><a:schemeClr val=""phClr""><a:shade val=""63000""/><a:satMod val=""120000""/></a:schemeClr></a:gs></a:gsLst><a:lin ang=""5400000"" scaled=""0""/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/><a:extLst><a:ext uri=""{05A4C25C-085E-4340-85A3-A5531E510DB2}""><thm15:themeFamily xmlns:thm15=""http://schemas.microsoft.com/office/thememl/2012/main"" name=""Office Theme"" id=""{62F939B6-93AF-4DB8-9C6B-D6C7DFDC589F}"" vid=""{4A3C46E8-61CC-4603-A589-7422A47A8E4A}""/></a:ext></a:extLst></a:theme>";
            StartExstream(xContents, xFilename);

            xFilename = @"C:\Users\david\Desktop\Book3\xl\worksheets\sheet1.xml";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><worksheet xmlns=""http://schemas.openxmlformats.org/spreadsheetml/2006/main"" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships"" xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006"" mc:Ignorable=""x14ac xr xr2 xr3"" xmlns:x14ac=""http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"" xmlns:xr=""http://schemas.microsoft.com/office/spreadsheetml/2014/revision"" xmlns:xr2=""http://schemas.microsoft.com/office/spreadsheetml/2015/revision2"" xmlns:xr3=""http://schemas.microsoft.com/office/spreadsheetml/2016/revision3"" xr:uid=""{54E3D330-4E78-4755-89E0-1AADACAC4953}""><dimension ref=""A1:A3""/><sheetViews><sheetView tabSelected=""1"" workbookViewId=""0""><selection activeCell=""A4"" sqref=""A4""/></sheetView></sheetViews><sheetFormatPr defaultRowHeight=""15"" x14ac:dyDescent=""0.25""/><sheetData><row r=""1"" spans=""1:1"" x14ac:dyDescent=""0.25""><c r=""A1""><v>1</v></c></row><row r=""2"" spans=""1:1"" x14ac:dyDescent=""0.25""><c r=""A2""><v>2</v></c></row><row r=""3"" spans=""1:1"" x14ac:dyDescent=""0.25""><c r=""A3""><v>3</v></c></row></sheetData><pageMargins left=""0.7"" right=""0.7"" top=""0.75"" bottom=""0.75"" header=""0.3"" footer=""0.3""/></worksheet>";
            StartExstream(xContents, xFilename);

            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();

            bool StartExstream(string strLine, string strFileName)
            {
                // Write the string to a file.
                using (StreamWriter outputFile = new StreamWriter(strFileName))
                {
                    outputFile.WriteLine(strLine);
                    return true;
                }
            }
        }
    }
}

Наконец, заархивируйте в ZIP структуру папок, содержащую XML -

namespace ZipFolder
// .NET Framework 4.7.2
// https://coderhelper.com/questions/15241889/i-didnt-find-zipfile-class-in-the-system-io-compression-namespace?answertab=votes#tab-top
{
    class Program
    {
        static void Main(string[] args)
        {
            string xlPath = @"C:\Users\david\Desktop\Book3.xlsx";
            string folderPath = @"C:\Users\david\Desktop\Book3";

            System.IO.Compression.ZipFile.CreateFromDirectory(folderPath, xlPath);

            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
}

При этом создается файл Excel с именем Book3.xlsx, который допустим и корректно открывается в Excel 365 в Windows 11.

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

namespace UnZipXL
// .NET Framework 4.7.2
// https://coderhelper.com/questions/15241889/i-didnt-find-zipfile-class-in-the-system-io-compression-namespace?answertab=votes#tab-top
{
    class Program
    {
        static void Main(string[] args)
        {
            string XLPath = @"C:\Users\david\Desktop\Book2.xlsx";
            string extractPath = @"C:\Users\david\Desktop\extract";

            System.IO.Compression.ZipFile.ExtractToDirectory(XLPath, extractPath);

            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
}

Обновление:

Вот фрагмент кода для обновления файла Excel. Это снова очень просто.

//
// https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-write-text-to-a-file
// .NET Framework 4.7.2
//
using System.IO;

namespace UpdateWorksheet5
{
    class Program
    {
        static void Main(string[] args)
        {
            string xContents = @"a";
            string xFilename = @"a";

            xFilename = @"C:\Users\david\Desktop\Book3\xl\worksheets\sheet1.xml";
            xContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><worksheet xmlns=""http://schemas.openxmlformats.org/spreadsheetml/2006/main"" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships"" xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006"" mc:Ignorable=""x14ac xr xr2 xr3"" xmlns:x14ac=""http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"" xmlns:xr=""http://schemas.microsoft.com/office/spreadsheetml/2014/revision"" xmlns:xr2=""http://schemas.microsoft.com/office/spreadsheetml/2015/revision2"" xmlns:xr3=""http://schemas.microsoft.com/office/spreadsheetml/2016/revision3"" xr:uid=""{54E3D330-4E78-4755-89E0-1AADACAC4953}""><dimension ref=""A1:A3""/><sheetViews><sheetView tabSelected=""1"" workbookViewId=""0""><selection activeCell=""A4"" sqref=""A4""/></sheetView></sheetViews><sheetFormatPr defaultRowHeight=""15"" x14ac:dyDescent=""0.25""/><sheetData><row r=""1"" spans=""1:1"" x14ac:dyDescent=""0.25""><c r=""A1""><v>1</v></c></row><row r=""2"" spans=""1:1"" x14ac:dyDescent=""0.25""><c r=""A2""><v>2</v></c></row><row r=""3"" spans=""1:1"" x14ac:dyDescent=""0.25""><c r=""A3""><v>3</v></c></row></sheetData><pageMargins left=""0.7"" right=""0.7"" top=""0.75"" bottom=""0.75"" header=""0.3"" footer=""0.3""/></worksheet>";
            xContents = xContents.Remove(941, 1).Insert(941, "0"); //  character to replace is at 942 => index 941
            StartExstream(xContents, xFilename);

            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();

            bool StartExstream(string strLine, string strFileName)
            {
                // Write the string to a file.
                using (StreamWriter outputFile = new StreamWriter(strFileName))
                {
                    outputFile.WriteLine(strLine);
                    return true;
                }
            }
        }
    }
}

Обновление 2. Этот код работает практически без изменений, за исключением путей к папкам на Mac. Использование Microsoft Excel Online, .NET Framework 3.1, Visual Studio 2019 для Mac, MacOS Monterey 12.1.

Rup
14 ноября 2021 в 14:54
2

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

Panagiotis Kanavos
24 ноября 2021 в 17:03
1

Это совсем не просто. Это худший сценарий

Ozan Yasin Dogan
6 декабря 2021 в 23:19
1

Я не знал, что файлы xlsx на самом деле представляют собой заархивированные папки с файлами xml: D, спасибо за информацию!

Rup
25 декабря 2021 в 23:51
1

Престижность за попытку, но редактирование одного значения по смещению строки далеко не является достаточно общим, чтобы быть полезным для всех. Как бы вы написали в этой схеме функцию, которая принимала бы строку и столбец ячейки и присваивала бы этой ячейке число? И как бы вы сделали то же самое для строки (что сложнее IIRC!)

avatar
toha
1 октября 2021 в 07:18
0

В своих проектах я использую несколько библиотек .net для извлечения файлов Excel (как .xls, так и .xlsx)

Для экспорта данных я часто использую rdlc.

Чтобы изменить файлы Excel, которые я использую (пример кода, когда я пытаюсь установить пустую ячейку A15):

ClosedXML

        //Closed XML
        var workbook = new XLWorkbook(sUrlFile); // load the existing excel file
        var worksheet = workbook.Worksheets.Worksheet(1);
        worksheet.Cell("A15").SetValue("");
        workbook.Save();

IronXL

       string sUrlFile = "G:\\ReportAmortizedDetail.xls";
        WorkBook workbook = WorkBook.Load(sUrlFile);
        WorkSheet sheet = workbook.WorkSheets.First();
        //Select cells easily in Excel notation and return the calculated value
        sheet["A15"].First().Value = "";
        sheet["A15"].First().FormatString = "";

        workbook.Save();
        workbook.Close();
        workbook = null;

SpireXLS (когда я пытаюсь, библиотека распечатывает дополнительный лист, чтобы указать, что мы используем пробную библиотеку

            string sUrlFile = "G:\\ReportAmortizedDetail.xls";
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(sUrlFile);
            //Get the 1st sheet
            Worksheet sheet = workbook.Worksheets[0];
            //Specify the cell range
            CellRange range = sheet.Range["A15"];
            //Find all matched text in the range
            CellRange[] cells = range.FindAllString("hi", false, false);
            //Replace text
            foreach (CellRange cell in range)
            {
                cell.Text = "";
            }
            //Save
            workbook.Save();

Джет Оледб

    //ExcelTool Class
    public static int ExcelUpdateSheets(string path, string sWorksheetName, string sCellLocation, string sValue)
    {
        int iResult = -99;
        String sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO'";
        OleDbConnection objConn = new OleDbConnection(sConnectionString);
        objConn.Open();
        OleDbCommand objCmdSelect = new OleDbCommand("UPDATE [" + sWorksheetName + "$" + sCellLocation + "] SET F1=" + UtilityClass.ValueSQL(sValue), objConn);
        objCmdSelect.ExecuteNonQuery();
        objConn.Close();

        return iResult;
    }

Использование:

    ExcelTool.ExcelUpdateSheets(sUrlFile, "ReportAmortizedDetail", "A15:A15", "");

Aspose

            var workbook = new Aspose.Cells.Workbook(sUrlFile);
            // access first (default) worksheet
            var sheet = workbook.Worksheets[0];
            // access CellsCollection of first worksheet
            var cells = sheet.Cells;
            // write HelloWorld to cells A1
            cells["A15"].Value = "";
            // save spreadsheet to disc
            workbook.Save(sUrlFile);
            workbook.Dispose();
            workbook = null;
avatar
EMP
14 июня 2021 в 14:20
16

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

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

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

avatar
8 декабря 2020 в 20:25
3

Я снова перекодировал код, и теперь вы можете создать файл .xls, позже вы сможете преобразовать его в формат Excel 2003 Open XML.

private static void exportToExcel(DataSet source, string fileName)
    {
        // Documentacion en:
        // https://en.wikipedia.org/wiki/Microsoft_Office_XML_formats
        // https://answers.microsoft.com/en-us/msoffice/forum/all/how-to-save-office-ms-xml-as-xlsx-file/4a77dae5-6855-457d-8359-e7b537beb1db
        // https://riptutorial.com/es/openxml

        const string startExcelXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"+
                 "<?mso-application progid=\"Excel.Sheet\"?>\r\n" +
                 "<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
                 "xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " +
                 "xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\r\n " +
                 "xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n " +
                 "xmlns:html=\"http://www.w3.org/TR/REC-html40\">\r\n " +
                 "xmlns:html=\"https://www.w3.org/TR/html401/\">\r\n " +

                 "<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">\r\n " +
                 "  <Version>16.00</Version>\r\n " +
                 "</DocumentProperties>\r\n " +
                 " <OfficeDocumentSettings xmlns=\"urn:schemas-microsoft-com:office:office\">\r\n " +
                 "  <AllowPNG/>\r\n " +
                 " </OfficeDocumentSettings>\r\n " +

                 " <ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">\r\n " +
                 "  <WindowHeight>9750</WindowHeight>\r\n " +
                 "  <WindowWidth>24000</WindowWidth>\r\n " +
                 "  <WindowTopX>0</WindowTopX>\r\n " +
                 "  <WindowTopY>0</WindowTopY>\r\n " +
                 "  <RefModeR1C1/>\r\n " +
                 "  <ProtectStructure>False</ProtectStructure>\r\n " +
                 "  <ProtectWindows>False</ProtectWindows>\r\n " +
                 " </ExcelWorkbook>\r\n " +

                 "<Styles>\r\n " +
                 "<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
                 "<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
                 "\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
                 "\r\n <Protection/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"BoldColumn\">\r\n <Font " +
                 "x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
                 " ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
                 "ss:ID=\"Decimal\">\r\n <NumberFormat " +
                 "ss:Format=\"0.0000\"/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"Integer\">\r\n <NumberFormat/>" +
                 "ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
                 "ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
                 "ss:Format=\"dd/mm/yyyy;@\"/>\r\n </Style>\r\n " +
                 "</Styles>\r\n ";
        System.IO.StreamWriter excelDoc = null;
        excelDoc = new System.IO.StreamWriter(fileName,false);

        int sheetCount = 1;
        excelDoc.Write(startExcelXML);
        foreach (DataTable table in source.Tables)
        {
            int rowCount = 0;
            excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
            excelDoc.Write("<Table>");
            excelDoc.Write("<Row>");
            for (int x = 0; x < table.Columns.Count; x++)
            {
                excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
                excelDoc.Write(table.Columns[x].ColumnName);
                excelDoc.Write("</Data></Cell>");
            }
            excelDoc.Write("</Row>");
            foreach (DataRow x in table.Rows)
            {
                rowCount++;
                //if the number of rows is > 64000 create a new page to continue output
                if (rowCount == 1048576)
                {
                    rowCount = 0;
                    sheetCount++;
                    excelDoc.Write("</Table>");
                    excelDoc.Write(" </Worksheet>");
                    excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
                    excelDoc.Write("<Table>");
                }
                excelDoc.Write("<Row>"); //ID=" + rowCount + "
                for (int y = 0; y < table.Columns.Count; y++)
                {
                    System.Type rowType;
                    rowType = x[y].GetType();
                    switch (rowType.ToString())
                    {
                        case "System.String":
                            string XMLstring = x[y].ToString();
                            XMLstring = XMLstring.Trim();
                            XMLstring = XMLstring.Replace("&", "&");
                            XMLstring = XMLstring.Replace(">", ">");
                            XMLstring = XMLstring.Replace("<", "<");
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                           "<Data ss:Type=\"String\">");
                            excelDoc.Write(XMLstring);
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.DateTime":
                            //Excel has a specific Date Format of YYYY-MM-DD followed by  
                            //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
                            //The Following Code puts the date stored in XMLDate 
                            //to the format above
                            DateTime XMLDate = (DateTime)x[y];
                            string XMLDatetoString = ""; //Excel Converted Date
                            XMLDatetoString = XMLDate.Year.ToString() +
                                 "-" +
                                 (XMLDate.Month < 10 ? "0" +
                                 XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
                                 "-" +
                                 (XMLDate.Day < 10 ? "0" +
                                 XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
                                 "T" +
                                 (XMLDate.Hour < 10 ? "0" +
                                 XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
                                 ":" +
                                 (XMLDate.Minute < 10 ? "0" +
                                 XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
                                 ":" +
                                 (XMLDate.Second < 10 ? "0" +
                                 XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
                                 ".000";
                            excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" +
                                         "<Data ss:Type=\"DateTime\">");
                            excelDoc.Write(XMLDatetoString);
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Boolean":
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                        "<Data ss:Type=\"String\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Int16":
                        case "System.Int32":
                        case "System.Int64":
                        case "System.Byte":
                            excelDoc.Write("<Cell ss:StyleID=\"Integer\">" +
                                    "<Data ss:Type=\"Number\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Decimal":
                        case "System.Double":
                            excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" +
                                  "<Data ss:Type=\"Number\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.DBNull":
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                  "<Data ss:Type=\"String\">");
                            excelDoc.Write("");
                            excelDoc.Write("</Data></Cell>");
                            break;
                        default:
                            throw (new Exception(rowType.ToString() + " not handled."));
                    }
                }
                excelDoc.Write("</Row>");
            }
            excelDoc.Write("</Table>");
            excelDoc.Write("</Worksheet>");               
            sheetCount++;
        }

        const string endExcelOptions1 = "\r\n<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">\r\n" +
            "<Selected/>\r\n" +
            "<ProtectObjects>False</ProtectObjects>\r\n" +
            "<ProtectScenarios>False</ProtectScenarios>\r\n" +
            "</WorksheetOptions>\r\n";

        excelDoc.Write(endExcelOptions1);
        excelDoc.Write("</Workbook>");
        excelDoc.Close();
    }
user1034912
16 июля 2021 в 00:21
0

Файл открывается, но excel выдает ошибку "Формат файла не соответствует расширению"

avatar
Klaus Oberdalhoff
15 ноября 2020 в 21:26
1

Интересно, почему никто не предложил PowerShell с бесплатным модулем ImportExcel; он легко создает файлы XML-Excel (xlsx).

Особенно просто при создании таблиц Excel из таких баз данных, как SQL Server...

TylerH
15 ноября 2020 в 21:27
0

К вашему сведению, расширение XLSX не имеет ничего общего с XML. Это просто современная (Office 2007+) версия расширения файла XLS.

Rup
16 ноября 2020 в 09:27
0

@TylerH Однако они основаны на XML. Файлы XLSX представляют собой ZIP-файлы XML-файлов, идея которых аналогична форматам файлов OpenOffice.

TylerH
16 ноября 2020 в 20:12
0

@Rup Да, файлы представляют собой проприетарную оболочку XML-данных. Но это не означает, что файлы являются файлами «XML-Excel». Это просто файлы Excel.

avatar
Miguel Silva
30 июня 2020 в 12:36
2

Вы можете установить пакет OpenXml nuget в Visual Studio. Вот небольшой код для экспорта таблицы данных в файл Excel:

Imports DocumentFormat.OpenXml
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet

Public Class ExportExcelClass
    Public Sub New()

    End Sub

    Public Sub ExportDataTable(ByVal table As DataTable, ByVal exportFile As String)
        ' Create a spreadsheet document by supplying the filepath.
        ' By default, AutoSave = true, Editable = true, and Type = xlsx.
        Dim spreadsheetDocument As SpreadsheetDocument = spreadsheetDocument.Create(exportFile, SpreadsheetDocumentType.Workbook)

        ' Add a WorkbookPart to the document.
        Dim workbook As WorkbookPart = spreadsheetDocument.AddWorkbookPart
        workbook.Workbook = New Workbook

        ' Add a WorksheetPart to the WorkbookPart.
        Dim Worksheet As WorksheetPart = workbook.AddNewPart(Of WorksheetPart)()
        Worksheet.Worksheet = New Worksheet(New SheetData())

        ' Add Sheets to the Workbook.
        Dim sheets As Sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(Of Sheets)(New Sheets())

        Dim data As SheetData = Worksheet.Worksheet.GetFirstChild(Of SheetData)()
        Dim Header As Row = New Row()
        Header.RowIndex = CType(1, UInt32)

        For Each column As DataColumn In table.Columns
            Dim headerCell As Cell = createTextCell(table.Columns.IndexOf(column) + 1, 1, column.ColumnName)
            Header.AppendChild(headerCell)
        Next

        data.AppendChild(Header)

        Dim contentRow As DataRow
        For i As Integer = 0 To table.Rows.Count - 1
            contentRow = table.Rows(i)
            data.AppendChild(createContentRow(contentRow, i + 2))
        Next

    End Sub

    Private Function createTextCell(ByVal columnIndex As Integer, ByVal rowIndex As Integer, ByVal cellValue As Object) As Cell
        Dim cell As Cell = New Cell()
        cell.DataType = CellValues.InlineString

        cell.CellReference = getColumnName(columnIndex) + rowIndex.ToString

        Dim inlineString As InlineString = New InlineString()
        Dim t As Text = New Text()
        t.Text = cellValue.ToString()
        inlineString.AppendChild(t)
        cell.AppendChild(inlineString)
        Return cell
    End Function

    Private Function createContentRow(ByVal dataRow As DataRow, ByVal rowIndex As Integer) As Row
        Dim row As Row = New Row With {
            .rowIndex = CType(rowIndex, UInt32)
        }

        For i As Integer = 0 To dataRow.Table.Columns.Count - 1
            Dim dataCell As Cell = createTextCell(i + 1, rowIndex, dataRow(i))
            row.AppendChild(dataCell)
        Next

        Return row
    End Function

    Private Function getColumnName(ByVal columnIndex As Integer) As String
        Dim dividend As Integer = columnIndex
        Dim columnName As String = String.Empty
        Dim modifier As Integer

        While dividend > 0
            modifier = (dividend - 1) Mod 26
            columnName = Convert.ToChar(65 + modifier).ToString() & columnName
            dividend = CInt(((dividend - modifier) / 26))
        End While

        Return columnName
    End Function
End Class
Kiquenet
30 января 2021 в 08:30
0

spreadsheetDocument.Create будет SpreadsheetDocument.Create?

avatar
Roman.Pavelko
21 декабря 2019 в 06:09
5

Вы можете попробовать мою библиотеку SwiftExcel. Эта библиотека записывает непосредственно в файл, поэтому она очень эффективна. Например, вы можете записать 100 тыс. строк за несколько секунд без использования памяти.

Вот простой пример использования:

using (var ew = new ExcelWriter("C:\\temp\\test.xlsx"))
{
    for (var row = 1; row <= 10; row++)
    {
        for (var col = 1; col <= 5; col++)
        {
            ew.Write($"row:{row}-col:{col}", col, row);
        }
    }
}
avatar
5 декабря 2019 в 21:14
3

Как создать файл Excel (.xslx) с помощью C# в OneDrive без установки Microsoft Office

Microsoft Graph API предоставляет API-интерфейсы File и Excel для создания и изменения файлов Excel, хранящихся в OneDrive, как для корпоративных, так и для потребительских учетных записей. Пакет NuGet Microsoft.Graph предоставляет множество интерфейсов для работы с API файлов и Excel.

{
  Name = "myExcelFile.xslx",
  File = new Microsoft.Graph.File()
};

// Create an empty file in the user's OneDrive.
var excelWorkbookDriveItem = await graphClient.Me.Drive.Root.Children.Request().AddAsync(excelWorkbook);

// Add the contents of a template Excel file.
DriveItem excelDriveItem;
using (Stream ms = ResourceHelper.GetResourceAsStream(ResourceHelper.ExcelTestResource))
{
    //Upload content to the file. ExcelTestResource is an empty template Excel file.
    //https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/item_uploadcontent
    excelDriveItem = await graphClient.Me.Drive.Items[excelWorkbookDriveItem.Id].Content.Request().PutAsync<DriveItem>(ms);
}

На данный момент у вас есть файл Excel, созданный в OneDrive пользователя (предприятия или потребителя) или группы. Теперь вы можете использовать Excel API, чтобы вносить изменения в файл Excel без использования Excel и без необходимости понимать формат Excel XML.

Kiquenet
11 декабря 2020 в 15:48
0

полный образец? что такое графклиент? помощник по ресурсам? ExcelTestResource - это пустой файл шаблона Excel?

Michael Mainer
12 декабря 2020 в 17:11
0

@Kiquenet graphClient находится в пакете Microsoft.Graph NuGet. Да, ExcelTestResource — это пустой файл Excel. ResourceHelper получает пустой файловый поток Excel. Вот пример, в котором используется GraphServiceClient (в данном примере — graphClient): github.com/microsoftgraph/dotnetcore-console-sample. В нем нет примера использования Excel API.

avatar
GEOCHET
19 ноября 2019 в 14:32
50

На самом деле вы можете захотеть проверить классы взаимодействия, доступные в C # (например, Microsoft.Office.Interop.Excel. Вы говорите, что нет OLE (а это не так), но классы взаимодействия очень просты в использовании. Ознакомьтесь с Документация по C # здесь (Interop for Excel начинается на странице 1072 C # PDF).

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

Обратите внимание на позицию Microsoft по этому поводу:

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

MagicKat
29 сентября 2008 в 22:40
6

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

MagicKat
29 сентября 2008 в 22:42
10

@Ricky B: Кроме того, по моему опыту взаимодействия, он действительно использует excel. Каждый раз, когда мы его использовали, если на компьютере не был установлен Excel, мы получали исключения COM.

Jennifer Zouak
9 марта 2010 в 21:54
1

В случае OLE, даже при очень тщательной утилизации, в конечном итоге происходит утечка памяти или сбои. Это, пожалуй, нормально для обслуживаемых приложений / рабочих станций, но не рекомендуется для серверов (у MS есть база знаний, в которой это указано). Для нашего сервера мы просто перезагружаем его каждую ночь. Опять же, все работает нормально.

Jennifer Zouak
11 марта 2010 в 17:49
11

@Geoffrey: ах, хорошо, ты заставишь меня поработать над этим :) -> support.microsoft.com/kb/257757 Microsoft в настоящее время не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любого необслуживаемого, неинтерактивного клиентского приложения ...

md1337
3 февраля 2011 в 18:52
4

Я перехожу к этому обсуждению после того, как больше недели боролся с взаимодействием, и, если ваши потребности не очень просты, это не сработает. Поддержка форматирования вашей электронной таблицы ужасна, что, возможно, является причиной создания файла .xls, а не просто плоского файла .csv. Например, пробовали ли вы вывести в ячейке более 911 символов или пытались установить одинаковую ширину объединенных ячеек? У меня есть, и я не могу сказать вам, насколько я ненавижу это дерьмо сейчас ... Сделайте себе одолжение и воспользуйтесь одной из бесплатных библиотек, упомянутых в этом обсуждении.

pkuderov
13 мая 2013 в 15:11
0

Я еще не изменил Interop на EPPlus (но уже на полпути), поэтому я действительно не знаю, насколько лучше с ним жизнь, но, работая с Interop, я испытывал столько боли в очень неожиданных случаях почти каждый раз, когда мне было нужно что-то более сложное, чем просто создать файл .xls / .xlsx с простой таблицей внутри. И упомянутая выше «магия дважды проверьте, чтобы избавиться от всего» - одна из тех повседневных проблем. Но да, это работает, и в большинстве случаев этого достаточно.

Mark
3 декабря 2019 в 07:13
1

Предупреждение: библиотека Microsoft.Office.Interops зависит от устанавливаемого Excel. Таким образом не отвечает на вопрос пользователя

JSON
21 октября 2020 в 18:58
1

Он буквально говорит, что не хочет устанавливать офис.

avatar
Forgotten Semicolon
13 ноября 2019 в 17:26
66

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

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

Luka Ramishvili
4 января 2012 в 07:23
6

Это так спонтанно, но работает (не говоря уже о выдаче предупреждения при открытии в Excel) и настолько проста, что заслуживает своего решения. Хотя только для того, чтобы показать, что вы можете экспортировать файл excel :))

Jill
30 марта 2016 в 18:24
3

Это решение отлично сработало для меня, просто обратите внимание, что вы не можете использовать расширение .xlsx

Kristen Hammack
8 декабря 2016 в 22:55
0

Некоторые люди в моей организации не могут открывать файлы Excel, созданные таким образом в Office 2010 и более поздних версиях. Не знаю, в чем проблема, но мне пришлось свернуть собственную реализацию OpenXML. (см. ответ Соггера)

John Coleman
6 мая 2021 в 21:35
0

Еще более легкая версия - просто создать файл csv, который Windows связывает с Excel.

avatar
Sogger
25 сентября 2019 в 17:05
199

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

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

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

Ссылки:

Josh Brown
20 сентября 2011 в 13:03
4

Важно отметить, что размер DLL для этого составляет чуть более 5 МБ и ограничен форматами Office 2007. Но, безусловно, самое простое и быстрое решение, которое мне подходит.

Snuffleupagus
4 января 2013 в 16:47
19

Напоминаем, что версия 2.5 отсутствует и может быть загружена здесь.

Tsahi Asher
24 декабря 2014 в 16:27
12

SDK моделирует XML в классы, так что каждый тег XML сопоставляется с тегом, а затем необходимо правильно построить иерархию классов (каждый экземпляр имеет набор дочерних экземпляров / тегов). Это означает, что вы должны знать XML-структуру файла Excel, что очень сложно. Намного проще использовать упомянутую выше оболочку, такую ​​как EPPlus, которая упрощает работу.

Greg
17 февраля 2017 в 17:51
2

Отличный образец Microsoft Open XML SDK - Open XML Writer можно найти по адресу polymathprogrammer.com/2012/08/06/… Или см. Решение для переполнения стека coderhelper.com/questions/11370672/…

Greg
17 февраля 2017 в 17:54
4

Я считаю, что средство записи Open XML из пакета Microsoft Open XML SDK великолепно. Используя приведенные выше решения (особенно образец Винсента Тома (Poly Math)), легко создать писатель, который обрабатывает большие наборы данных и записывает записи способом, аналогичным и не слишком сложным для того, что вы бы сделали для CSV; но вместо этого вы пишете xml. Open XML - это образ мышления, в котором Microsoft считает свои новые форматы Office. И вы всегда можете переименовать их из файлов .xslx в .zip, если вам захочется потрогать их XML-содержимое.

horeaper
30 мая 2018 в 23:37
1

Обратите внимание, что Open XML SDK теперь имеет открытый исходный код и размещен на github. Также вам не нужно устанавливать SDK, просто запустите nuget, и DocumentFormat.OpenXml - это все, что вам нужно. Он работает со стандартом .net 1.3.

elnaz jangi
12 июня 2020 в 13:33
0

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

Flydog57
2 декабря 2020 в 17:12
0

Не забудьте загрузить OpenXML Productivity Tool с сайта Microsoft при использовании этого API. Как я работаю: создайте документ с нужным мне содержанием и форматом в Excel и сохраните его. Откройте его с помощью инструмента. Очистите интересующий меня код от кода, отраженного в инструменте, и начните с него. Я также использую этот инструмент для проверки и проверки своих результатов на ошибки. Когда я хочу добавить новую функцию в свой код, я использую функцию инструментов «Diff», чтобы выяснить, как эта функция должна быть закодирована. Это действительно важный инструмент разработки OpenXML

avatar
Jan Källman
23 июня 2019 в 20:24
619

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

Simon D
5 февраля 2012 в 12:30
81

Лицензия теперь LGPL, примечания к выпуску здесь: epplus.codeplex.com/releases/view/79802

Paul Chernoch
10 февраля 2015 в 18:55
14

Примеры были полезны. Мне удалось сменить код с использованием библиотеки взаимодействия Microsoft (ужасно медленной) на эту библиотеку (версия 4.x) за пару часов. Мой тест записывает файл с двумя вкладками и примерно 750 000 ячеек. Использование взаимодействия с MS заняло 13 минут. Использование EPPlus заняло 10 секунд, что примерно в 80 раз больше. Очень счастлив!

PeterX
24 февраля 2015 в 03:39
0

@ JanKällman Вам следует обновить свою страницу CodePlex, чтобы показать, что у вас есть следующие доступные методы: LoadFromCollection<T>, LoadFromDataTable и т. Д. (Можно найти здесь)

Chris Marisic
12 августа 2015 в 16:10
3

Для ясности в этом треде, LGPL позволяет связывать программное обеспечение без возникновения заразной части GPL. Вам нужно только открыть исходный код изменений, которые вы вносите в ClosedXml, или если вы напрямую помещаете исходный код (в отличие от ссылок на сборки ClosedXml) внутри своего приложения, тогда вам нужно открыть исходный код вашего приложения.

Marc Meketon
15 февраля 2018 в 22:53
6

@Paul Chernoch: Мы очень быстро заполняем большие листы Excel с помощью взаимодействия. Секрет в том, чтобы сделать массовое обновление. Создайте блок объекта [,], заполните его, затем запишите эту матрицу в Excel за один раз: excelWorksheet.get_Range (range) .Value2 = block;

Luke
21 февраля 2020 в 06:48
11

Похоже, лицензирование переходит с LGPL на лицензию Polyform Noncommercial 1.0.0.

Kiquenet
8 декабря 2020 в 17:37
3

EPPlus версии 5 не бесплатно?

avatar
Leniel Maccaferri
7 февраля 2019 в 14:13
173

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

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

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

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

Создание электронных таблиц Excel .XLS и .XLSX на C #

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

John M
30 апреля 2010 в 13:45
7

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

avatar
4 января 2019 в 05:17
-2

проверьте это, нет необходимости в сторонних библиотеках, вы можете просто экспортировать данные в файл 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();
Rup
4 января 2019 в 09:44
4

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

avatar
5 ноября 2018 в 07:46
1

Чтобы сохранить xls в формат xlsx, нам просто нужно вызвать метод SaveAs из библиотеки Microsoft.Office.Interop.Excel. Этот метод принимает около 16 параметров, один из которых также является форматом файла.

Документ Microsoft: Здесь Аргументы метода "Сохранить как"

Объект, который нам нужно передать, похож на

wb.SaveAs(filename, 51, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, false, false, 1,1, true, 
System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value)

Здесь 51 — это значение перечисления для XLSX

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

Rup
5 ноября 2018 в 14:45
0

Также есть старый ответ об использовании Office Interop.

avatar
AlexDev
18 июля 2018 в 06:20
5

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

Kiquenet
11 декабря 2020 в 15:46
0

полный образец исходного кода? rdlc выдает проблемы с памятью в ASP.NET travis.io/blog/2014/10/27/rdlc-performance-issues-dotnet45 и coderhelper.com/questions/33436607/…

avatar
ScaleOvenStove
18 июля 2018 в 06:19
6

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

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

avatar
18 июля 2018 в 06:17
5

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

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

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

Kiquenet
11 декабря 2020 в 15:43
0

Бесплатная версия ограничена: максимальное количество строк на листе — 150.

avatar
Nick
18 июля 2018 в 06:17
7

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

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

avatar
Harsha.Vaswani
18 июля 2018 в 06:17
16

Я написал простой код для экспорта набора данных в 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();
    }
Rup
23 июля 2015 в 09:39
1

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

Kiquenet
8 декабря 2020 в 17:54
0

Поддерживает xlsx? OpenXML?

Mauricio Kenny
8 декабря 2020 в 20:22
0

Типа это Open XML, но вы можете писать только файл .xls и отлично работает. Позаботьтесь о пустых местах в тегах. Используйте мой код, отредактированный ниже.

avatar
biozinc
18 июля 2018 в 06:14
18

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

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

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

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

liya
3 декабря 2009 в 08:08
0

Этот работает как с .net, так и с java, и стоит недорого. SmartXLS smartxls.com

avatar
ManiacZX
18 июля 2018 в 06:13
24

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

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

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

avatar
Davis Jebaraj
18 июля 2018 в 06:12
22

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);

Весь набор элементов управления доступен бесплатно по программе Community License, если вы соответствуете требованиям (доход менее 1 миллиона долларов США). Примечание: я работаю в Syncfusion.

Kiquenet
8 декабря 2020 в 17:51
0

Syncfusion Не бесплатно

avatar
Sam Warwick
18 июля 2018 в 06:09
28

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

avatar
Armfoot
18 июля 2018 в 06:08
56

Если вы создаете файлы 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");
Druid
8 июня 2011 в 12:40
9

Я пробовал использовать это в проекте, который строит довольно большие листы Excel. Отличная библиотека, но очень плохая по производительности. Я только что сравнил проект, над которым я работаю: ClosedXML (v 0.53.3) занял 92 489 мс, тогда как EPPlus (v 2.9.03, для тестирования - мы не можем использовать, потому что это GPL) занял 16 500 мс.

Chris Marisic
12 августа 2015 в 16:08
1

@Druid, лицензия LGPL, при условии, что вы не изменяете исходный код на ClosedXML, можно бесплатно использовать epplus.codeplex.com/license

Jeremy Cook
29 июля 2021 в 14:22
0

Я ценю, что ClosedXML имеет открытый исходный код (MIT). На момент написания этой статьи проект EPPlus с лицензией LGPL на GitHub заархивирован, а его последний выпуск был в январе 2019 года.

avatar
18 июля 2018 в 06:04
50

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

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

avatar
Nate
18 июля 2018 в 06:03
67

Я использовал несколько вариантов:

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

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

Jeremy
17 сентября 2010 в 13:55
0

Будьте осторожны с ExcelPackage, если вам нужно поддерживать XLS. Мне было трудно с этим, и в конце концов я перешел на ExcelLibrary.

Nate
21 сентября 2010 в 15:16
0

Определенно верно. ExcelPackage / ExML - хороший вариант, только если вам нужна поддержка XLSX.

Pragmateek
3 ноября 2013 в 19:00
5

Обратите внимание, что у ExcelPackage есть преемник: EPPlus (epplus.codeplex.com), который поддерживает XLSX. По сравнению, например, с NPOI, меня беспокоит только производительность, например когда много столбцов.

avatar
Joe Erickson
18 июля 2018 в 06:00
82

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

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

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

md1337
3 февраля 2011 в 18:43
11

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

avatar
Panos
18 июля 2018 в 05:58
113

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

ИЗМЕНИТЬ - Еще несколько ссылок:

Lamar
30 сентября 2008 в 01:45
4

Может кто-нибудь подтвердить, работает ли это при работе в x64? Я почти уверен, что Jet работает только в том случае, если ваше приложение скомпилировано или запущено в 32-битном режиме.

Chris Richner
16 июня 2009 в 07:31
2

Я только что проверил это соединение, и оно не удалось на Windows Server 2008 R2 x64 RC, похоже, что нужно установить драйвер системы Office 2007: Компоненты подключения к данным [microsoft.com/downloads/…

dbkk
29 сентября 2009 в 09:02
26

Будьте с этим очень осторожны - это большая уродливая путаница (например, иногда он угадывает тип столбца и отбрасывает все данные, которые не подходят).

Kenny Mann
9 июня 2010 в 16:03
9

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

platypus
13 сентября 2014 в 18:32
9

Как человек, которому пришлось использовать OleDb в большом проекте, я говорю: «Держитесь подальше от него!» Иногда он не может получить значение ячейки только потому, что не может понять формат. У него нет операции удаления. Он работает совершенно иначе и непредсказуемо даже при малейшей смене провайдера. Я бы сказал, выбери проверенное коммерческое решение.

Justin
5 мая 2016 в 21:36
1

Microsoft обновила Jet, попробуйте эту ссылку coderhelper.com/questions/14401729/…

Stephen G Tuggy
9 июля 2016 в 05:33
2

В предыдущей работе мы использовали распространяемый компонент Microsoft Access Database Engine 2010. Он имел форму драйвера OLEDB, который позволял читать и записывать файлы Excel, а также файлы формата Access. Обратите внимание, что эта загрузка не требует установки всего пакета Office. Также обратите внимание, что он поставляется как в 32-битном, так и в 64-битном вариантах. Очень важно, чтобы вы соответствовали 32-битной или 64-битной версии архитектуре хост-процесса , который будет обращаться к файлу (файлам). В нашем случае хост-процессом был SSIS.

avatar
27 сентября 2017 в 15:18
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% открытый исходный код. Не стесняйтесь использовать, редактировать и делиться ;)

avatar
Taterhead
25 сентября 2017 в 03:57
12

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

Обзор задействованного процесса:

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

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

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

enter image description here

TonyG
26 июля 2018 в 16:34
1

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

avatar
5 апреля 2017 в 09:00
1

Если вы создаете таблицу данных или представление сетки данных из кода, вы можете сохранить все данные с помощью этого простого метода. Этот метод не рекомендуется, но он работает на 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!");
   }
avatar
Mike Gledhill
9 июля 2016 в 17:21
37

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

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

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

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

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

Нет ничего проще ...

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

user604613
23 января 2017 в 15:33
1

Это кажется немного вводящим в заблуждение, поскольку вы просите пожертвование, чтобы получить все функции.

Mike Gledhill
2 мая 2017 в 14:15
1

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

avatar
2 декабря 2015 в 13:30
18

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

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

avatar
saurabh27
13 марта 2015 в 21:17
-6

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

for (int i = 0; i < TotalFile; i++)
{
    Contact.Clear();
    if (innerloop == SplitSize)
    {
        for (int j = 0; j < SplitSize; j++)
        {
            string strContact = DSt.Tables[0].Rows[i * SplitSize + j][0].ToString();
            Contact.Add(strContact);
        }
        string strExcel = strFileName + "_" + i.ToString() + ".xlsx";
                         File.WriteAllLines(strExcel, Contact.ToArray());
    }
}

см. также ссылку

http://dotnet-magic.blogspot.in/2011/10/createformat-excel-file-from-cnet.html

Rup
22 декабря 2014 в 20:48
2

Все это зависит от вашего класса Contact, и вы не сказали нам, что это такое. Если это работает для xls, то, скорее всего, вы на самом деле пишете HTML, который не является настоящим файлом Excel. И ваша ссылка использует взаимодействие, которое, как упоминалось выше, не должно использоваться на стороне сервера и может замедлять заполнение больших таблиц.

saurabh27
23 декабря 2014 в 09:53
1

Контакт - это связанный список, а не класс. Объявите список ссылок и использовал его, потому что я не знал размер данных, поэтому я использовал связанный список.

Rup
23 декабря 2014 в 09:55
1

О, так вы создаете простой текстовый файл с одним элементом в строке? Итак, Excel рассматривает это как CSV без запятых?

avatar
Dimi Toulakis
26 октября 2012 в 04:26
19

Ну,

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

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

Shahzad Latif
29 августа 2011 в 11:55
0

Чтобы быть более точным, вы можете использовать Aspose.Cells для .NET, чтобы создавать файлы Excel (XLS, XLSX) в вашем приложении .NET.

Mike Gledhill
5 января 2012 в 13:10
11

Да, вы можете, если вы не против заплатить минимальный лицензионный сбор в размере 999 долларов. Попробуйте библиотеку MikesKnowledgeBase ... которая на 999 долларов дешевле этой !!

avatar
11 ноября 2011 в 13:51
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};
    }
}
Kiquenet
11 декабря 2020 в 15:41
0

Устаревший код в codeplex?

avatar
23 августа 2011 в 16:52
14

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

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

avatar
Gaurav
28 апреля 2011 в 11:44
12
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, это может вам помочь

Rup
28 апреля 2011 в 11:46
7

Нет, это генерирует HTML, помеченный как файл Excel, а не как настоящий файл Excel. Да, сам Excel откроет это нормально, но другие программы, использующие электронные таблицы, в том числе, например, бесплатное средство просмотра Excel от Microsoft, не примут его. Лучше создать настоящий файл Excel, используя одну из библиотек здесь.

Rup
28 апреля 2011 в 11:48
0

Вы также должны использовать System.Net.Mime.ContentDisposition для генерации текста заголовка content-disposition, а не добавления строки - это будет правильно обрабатывать имена файлов, содержащие пробелы и т. Д.

Kiquenet
11 декабря 2020 в 15:42
0

GridViewExportUtil только для Интернета. А для Windows Forms, WPF, консоли, служебной Windows, модульного теста или надстройки?

avatar
16 февраля 2011 в 11:47
12

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

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

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

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

avatar
9 февраля 2011 в 10:39
3

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

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

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

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

Slauma
9 февраля 2011 в 12:45
0

Почему второй способ проще? Разве это не то же самое (добавление собственной библиотеки объектов в ваш проект)? Вам нужно установить Excel, чтобы эта библиотека объектов работала?

TrueWill
9 февраля 2011 в 18:17
7

Microsoft не рекомендует и не поддерживает автоматизацию Office из неинтерактивных приложений, таких как ASP.NET. См. support.microsoft.com/kb/257757.

Leslie Godwin
25 июня 2015 в 09:21
0

Excel довольно ненадежен и медленный, когда дело доходит до автоматизации.

avatar
Slace
26 октября 2010 в 02:47
16

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

avatar
Kyralessa
22 октября 2009 в 15:30
12

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

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

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

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

avatar
4 ноября 2008 в 20:15
7

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

Раньше мы генерировали таблицы Excel в классическом asp as sylk, а сейчас мы ищем и excelgenerater.

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

avatar
29 сентября 2008 в 22:39
12

IKVM + POI

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