c# - salvar - write excel using epplus




Como criar o arquivo Excel(.XLS e.XLSX) em C#sem instalar o Ms Office? (20)

A maneira mais simples e rápida de criar um arquivo do Excel a partir do C # é usar a Open XML Productivity Tool. A Open XML Productivity Tool é fornecida com a instalação do Open XML SDK. A ferramenta faz engenharia reversa de qualquer arquivo do Excel em código C #. O código C # pode então ser usado para gerar novamente esse arquivo.

Uma visão geral do processo envolvido é:

  1. Instale o SDK do Open XML com a ferramenta.
  2. Crie um arquivo do Excel usando o cliente do Excel mais recente com a aparência desejada. Nomeie-o como DesiredLook.xlsx .
  3. Com a ferramenta aberta DesiredLook.xlsx e clique no botão Refletir código próximo ao topo.
  4. O código C # do seu arquivo será gerado no painel direito da ferramenta. Adicione isso à sua solução C # e gere arquivos com essa aparência desejada.

Como bônus, esse método funciona para qualquer arquivo do Word e do PowerPoint. Como desenvolvedor do C #, você fará alterações no código para atender às suas necessidades.

Eu desenvolvi um aplicativo WPF simples no github que será executado no Windows para essa finalidade. Existe uma classe de espaço reservado chamada GeneratedClass onde você pode colar o código gerado. Se você voltar uma versão do arquivo, ele irá gerar um arquivo excel como este:

Como posso criar uma planilha do Excel com C # sem exigir que o Excel seja instalado na máquina que está executando o código?


A solução comercial, SpreadsheetGear for .NET , fará isso.

Você pode ver exemplos ASP.NET (C # e VB) ao vivo here e baixar uma versão de avaliação here .

Disclaimer: Eu possuo SpreadsheetGear LLC


Algumas opções que usei:

Se XLSX é uma obrigação: ExcelPackage é um bom começo, mas morreu quando o desenvolvedor desistiu de trabalhar nele. O ExML pegou de lá e adicionou alguns recursos. ExML não é uma opção ruim, ainda estou usando em alguns sites de produção.

Para todos os meus novos projetos, porém, estou usando o NPOI , a porta .NET do poi.apache.org . NPOI 2.0 (Alpha) também suporta XLSX.


Alguns fornecedores de componentes de terceiros, como o Infragistics ou o Syncfusion, fornecem excelentes recursos de exportação do Excel que não exigem a instalação do Microsoft Excel.

Como esses fornecedores também fornecem componentes de grade de interface do usuário avançados, esses componentes são especialmente úteis se você quiser que o estilo e o layout de uma exportação do Excel imitem o estado atual de uma grade na interface do usuário de seu aplicativo.

Se a sua exportação se destina a ser executada no lado do servidor, com ênfase nos dados a serem exportados e sem nenhum link para a interface do usuário, então eu escolheria uma das opções livres de código aberto (por exemplo, ExcelLibrary).

Eu já estive envolvido com projetos que tentaram usar a automação do lado do servidor no pacote Microsoft Office. Com base nessa experiência, recomendo veementemente essa abordagem.


Aqui está uma maneira de fazer isso com LINQ to XML, completo com código de amostra:

Importe e exporte dados do Excel rapidamente com o LINQ para XML

É um pouco complexo, já que você precisa importar namespaces e assim por diante, mas permite evitar dependências externas.

(Além disso, é claro, é o VB .NET, não o C #, mas você sempre pode isolar o material do VB .NET em seu próprio projeto para usar XML Literais e fazer todo o resto em C #.)


As várias bibliotecas XML do Office 2003 disponíveis funcionam muito bem para arquivos menores do Excel. No entanto, acho que o tamanho de uma pasta de trabalho grande salva no formato XML é um problema. Por exemplo, uma pasta de trabalho com a qual eu trabalhe seria de 40 MB no novo (e reconhecidamente mais compactado) formato XLSX se torna um arquivo XML de 360MB.

Até onde minha pesquisa me levou, existem dois pacotes comerciais que permitem a saída para os formatos de arquivos binários mais antigos. Eles são:

Nem são baratos (500USD e 800USD respectivamente, eu acho). mas ambos funcionam independentemente do próprio Excel.

O que eu estaria curioso sobre o módulo de saída do Excel para os gostos do OpenOffice.org. Gostaria de saber se eles podem ser portados do Java para o .net.


E quanto a usar o Open XML SDK 2.0 para o Microsoft Office?

Alguns benefícios:

  • Não requer o Office instalado
  • Feito pela Microsoft = documentação decente do MSDN
  • Apenas um .net dll para usar no projeto
  • O SDK vem com muitas ferramentas como diff, validator, etc

Links:



Eu usei recentemente o FlexCel.NET e descobri que ele é uma excelente biblioteca! Eu não digo isso sobre muitos produtos de software. Não adianta dar todo o discurso de vendas aqui, você pode ler todos os recursos em seu site.

É um produto comercial, mas você obtém a fonte completa se você comprá-lo. Então eu suponho que você poderia compilá-lo em sua montagem se você realmente quisesse. Caso contrário, é apenas uma montagem extra para xcopy - sem configuração ou instalação ou qualquer coisa assim.

Eu não acho que você encontrará qualquer maneira de fazer isso sem bibliotecas de terceiros como o .NET framework, obviamente, não tem suporte embutido para ele e automação OLE é apenas um mundo inteiro de dor.


O OpenXML também é uma boa alternativa que ajuda a evitar a instalação do MS Excel no servidor. O Open XML SDK 2.0 fornecido pela Microsoft simplifica a tarefa de manipular pacotes Open XML e os elementos subjacentes do esquema Open XML dentro de um pacote. A API (Interface de programação de aplicativo) do Open XML encapsula muitas tarefas comuns que os desenvolvedores executam em pacotes Open XML.

Verifique isso em OpenXML: Alternativa que ajuda a evitar a instalação do MS Excel no servidor


Se você está feliz com o formato xlsx, tente meu projeto GitHub codeplex . EPPlus . Começou com a fonte do ExcelPackage, mas hoje é uma reescrita total. Suporta intervalos, estilo de célula, gráficos, formas, imagens, namesranges, autofilter e um monte de outras coisas.


Se você estiver criando arquivos do Excel 2007/2010, experimente este projeto de software livre: https://github.com/closedxml/closedxml

Ele fornece uma maneira orientada a objeto para manipular os arquivos (semelhante ao VBA) sem lidar com os aborrecimentos de documentos XML. Pode ser usado por qualquer linguagem .NET como C # e Visual Basic (VB).

O ClosedXML permite criar arquivos do Excel 2007/2010 sem o aplicativo do Excel. O exemplo típico é criar relatórios do Excel em um servidor da Web:

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");


Você já tentou sylk?

Nós costumávamos gerar excelentes planilhas no clássico asp como sylk e agora estamos procurando por um excelgenerater também.

As vantagens para o sylk são: você pode formatar as células.


Você pode criar arquivos Excel bem formatados usando esta biblioteca: http://officehelper.codeplex.com/documentation
Veja abaixo o exemplo:

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

onde sample se parece com isto:

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

Você pode querer dar uma olhada no GemBox.Spreadsheet .

Eles têm uma versão gratuita com todos os recursos, mas limitada a 150 linhas por folha e 5 folhas por pasta de trabalho, se isso estiver de acordo com suas necessidades.

Eu ainda não tive necessidade de usá-lo, mas parece interessante.


Você pode usar o OLEDB para criar e manipular arquivos do Excel. Marque esta opção: Lendo e escrevendo o Excel usando o OLEDB .

Exemplo típico:

using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'"))
{
  conn.Open();
  OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn);
  cmd.ExecuteNonQuery();
}

EDIT - Mais alguns links:


Você pode usar uma biblioteca chamada ExcelLibrary. É uma biblioteca gratuita de código aberto publicada no Google Code:

ExcelLibrary

Isso parece ser uma porta do PHP ExcelWriter que você mencionou acima. Ele não irá gravar no novo formato .xlsx ainda, mas eles estão trabalhando para adicionar essa funcionalidade em.

É muito simples, pequeno e fácil de usar. Além disso, possui um DataSetHelper que permite usar DataSets e DataTables para trabalhar facilmente com dados do Excel.

ExcelLibrary parece ainda funcionar apenas para o formato antigo do Excel (arquivos .xls), mas pode estar adicionando suporte no futuro para os formatos mais recentes 2007/2010.

Você também pode usar o EPPlus , que funciona apenas para arquivos no formato do Excel 2007/2010 (arquivos .xlsx).

Existem alguns bugs conhecidos em cada biblioteca, como observado nos comentários. Ao todo, o EPPlus parece ser a melhor escolha com o passar do tempo. Parece ser mais ativamente atualizado e documentado também.

Além disso, como observado por @ АртёмЦарионов abaixo, EPPlus tem suporte para tabelas dinâmicas e ExcelLibrary pode ter algum suporte ( problema de tabela dinâmica no ExcelLibrary )

Aqui estão alguns links para referência rápida:
ExcelLibrary - GPL menor do GNU
EPPlus - Licença Pública Geral Menor GNU (LGPL)

Aqui, alguns exemplos de código para o ExcelLibrary:

Aqui está um exemplo pegando dados de um banco de dados e criando uma pasta de trabalho a partir dele. Observe que o código da ExcelLibrary é a única linha na parte inferior:

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

Criando o arquivo do Excel é tão fácil quanto isso. Você também pode criar manualmente arquivos do Excel, mas a funcionalidade acima é o que realmente me impressionou.


IKVM + POI

Ou você poderia usar o Interop ...


Syncfusion Essential XlsIO pode fazer isso. Não depende do Microsoft Office e também possui suporte específico para diferentes plataformas.

Amostra de código:

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

Todo o conjunto de controles está disponível gratuitamente através do programa de licença da comunidade se você se qualificar (menos de 1 milhão de dólares em receita). Nota: Eu trabalho para o Syncfusion.







file-io