{"id":664,"date":"2016-02-21T23:41:34","date_gmt":"2016-02-21T23:41:34","guid":{"rendered":"http:\/\/www.fabiodomingos.com\/?p=664"},"modified":"2016-02-22T10:53:27","modified_gmt":"2016-02-22T10:53:27","slug":"net-closedxml-uma-alternativa-ao-excel-interop","status":"publish","type":"post","link":"https:\/\/www.fabiodomingos.com\/?p=664","title":{"rendered":"[.NET] ClosedXml: Uma alternativa ao Excel Interop"},"content":{"rendered":"<p>Apesar de ser bastante flex\u00edvel e simples de usar, a biblioteca interop do Excel deixa bastante a desejar em termos de desempenho. \u00c9 verdade que se tivessemos de fazer o trabalho \u00e0 m\u00e3o, levaria bastante mais tempo, mas quando se pode ganhar tempo, acho que tudo vale a pena experimentar.<\/p>\n<p>Ap\u00f3s v\u00e1rias pesquisas, encontrei uma possivel solu\u00e7\u00e3o que resolve alguns destes problemas, \u00e9 gratuita e chama-se &#8220;ClosedXML&#8221;.<\/p>\n<p><a href=\"https:\/\/www.fabiodomingos.com\/?attachment_id=665\" rel=\"attachment wp-att-665\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-665\" src=\"https:\/\/www.fabiodomingos.com\/wp-content\/uploads\/2016\/02\/closedxml-300x52.png\" alt=\"closedxml\" width=\"300\" height=\"52\" srcset=\"https:\/\/www.fabiodomingos.com\/wp-content\/uploads\/2016\/02\/closedxml-300x52.png 300w, https:\/\/www.fabiodomingos.com\/wp-content\/uploads\/2016\/02\/closedxml.png 595w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Em termos de sintaxe, \u00e9 bastante semelhante ao excel interop, em baixo mostro um exemplo de cria\u00e7\u00e3o de um novo livro excel, \u00a0adi\u00e7\u00e3o de uma <em>worksheet\u00a0<\/em>e de seguida gravo o livro:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:c# decode:true \">\/\/cria\u00e7\u00e3o do novo livro\r\nvar workbook = new XLWorkbook();\r\n\r\n\/\/Adicionar uma sheet ao mesmo\r\nvar worksheet = workbook.Worksheets.Add(\"Lista de Endere\u00e7os\");\r\n\r\n\/\/Gravar o livro criado\r\nworkbook.SaveAs(diretoria + \"\\\\ListaEnderecos.xlsx\");<\/pre>\n<p>&nbsp;<\/p>\n<p>Para abrir um livro j\u00e1 existente e escrever no mesmo:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:c# decode:true \">\/\/Abertura do ficheiro\r\nworkbook = new XLWorkbook(diretoria + \"\\\\ListaEnderecos.xlsx\", XLEventTracking.Disabled);\r\nvar sheet = workbook.Worksheet(1);\r\n\r\n\/\/Escrita do Cabe\u00e7alho\r\nsheet.Cell(1, \"A\").Value = \"N\u00ba artigo\";\r\nsheet.Cell(1, \"B\").Value = \"Designa\u00e7\u00e3o\";\r\nsheet.Cell(1, \"C\").Value = \"Quantidade\";\r\nsheet.Cell(1, \"D\").Value = \"Pre\u00e7o s\/ iva\";\r\nsheet.Cell(1, \"E\").Value = \"iva\";\r\n\r\n\/\/Definir cor de fundo das c\u00e9lulas\r\n\r\nsheet.Range(\"A1:E1\").Style.Fill.BackgroundColor = XLColor.Yellow;\r\n\r\n\/\/Gravar altera\u00e7\u00f5es\r\n\r\nworkbook.Save();<\/pre>\n<p>&nbsp;<\/p>\n<p>E basta isto, para escrever e formatar algumas c\u00e9lulas no ClosedXML, aqui, uma das principais diferen\u00e7as quando comparado ao Interop, \u00e9 o facto de em vez de Cells para fazer refer\u00eancia \u00e0 c\u00e9lula, usa-se apenas Cell e em vez [] usa-se (), destaca-se o facto de n\u00e3o ser necess\u00e1rio fechar a inst\u00e2ncia do Excel no fim da sua utiliza\u00e7\u00e3o, pois esta biblioteca escreve diretamente nos xml dos ficheiros, n\u00e3o sendo necess\u00e1rio ter a aplica\u00e7\u00e3o aberta para enviar comandos.<\/p>\n<p><strong>No entanto, destaca-se o facto de n\u00e3o suportar imagens (se tentar copiar uma folha completa, as imagens n\u00e3o ir\u00e3o passar para a nova), o facto de apenas suportar formatos de ficheiros baseados no padr\u00e3o &#8220;Open XML&#8221; (.xlsx) bem como o facto de n\u00e3o suportar ficheiros com macros (.xlsm), apesar de existirem por a\u00ed alguns\u00a0<em>workarounds<\/em> mas que ainda n\u00e3o experimentei.<\/strong><\/p>\n<p>Pode descarregar o ClosedXML gratuitamente em:\u00a0<a href=\"https:\/\/closedxml.codeplex.com\/\">https:\/\/closedxml.codeplex.com\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Apesar de ser bastante flex\u00edvel e simples de usar, a biblioteca interop do Excel deixa bastante a desejar em termos de desempenho. \u00c9 verdade que se tivessemos de fazer o trabalho \u00e0 m\u00e3o, levaria bastante mais tempo, mas quando se pode ganhar tempo, acho que tudo vale a pena experimentar. Ap\u00f3s v\u00e1rias pesquisas, encontrei uma &#8230; <a title=\"[.NET] ClosedXml: Uma alternativa ao Excel Interop\" class=\"read-more\" href=\"https:\/\/www.fabiodomingos.com\/?p=664\" aria-label=\"Leia mais sobre [.NET] ClosedXml: Uma alternativa ao Excel Interop\">Ler mais<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":139,"footnotes":""},"categories":[40,42,39],"tags":[44,45,46,25,43],"class_list":["post-664","post","type-post","status-publish","format-standard","hentry","category-net","category-c-desenvolvimento","category-desenvolvimento","tag-net","tag-c","tag-closedxml","tag-excel","tag-programacao"],"_links":{"self":[{"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=\/wp\/v2\/posts\/664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=664"}],"version-history":[{"count":2,"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=\/wp\/v2\/posts\/664\/revisions"}],"predecessor-version":[{"id":669,"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=\/wp\/v2\/posts\/664\/revisions\/669"}],"wp:attachment":[{"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabiodomingos.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}