Problemas al generar CSV con AngularJS y EPPlus

Estoy enviando una matriz de Objetos al server (WebApi), usando EEPlus para hacer un ExcelPackage.GetAsByteArray (); Luego enviándolo de vuelta a una interfaz de AngularJS.

Estoy almacenando la información en una DataTable para comenzar.

DataTable table = new DataTable(); table.Columns.Add("WOS Name", typeof(string)); table.Columns.Add("Consultant Name", typeof(string)); table.Columns.Add("Client", typeof(string)); table.Columns.Add("Cohort", typeof(string)); table.Columns.Add("Not Started", typeof(int)); table.Columns.Add("Awaiting Wos Release", typeof(int)); table.Columns.Add("Released To Consultant", typeof(int)); table.Columns.Add("Released To Wos", typeof(int)); table.Columns.Add("Awaiting Wos Signoff", typeof(int)); table.Columns.Add("Current", typeof(int)); table.Columns.Add("WOS Overdues", typeof(int)); table.Columns.Add("Consultant Overdues", typeof(int)); foreach (var stat in statistics) { table.Rows.Add( stat.WosName, stat.ConsultantName, stat.Client, stat.Cohort, stat.NotStarted, stat.AwaitingWosRelease, stat.ReleasedToConsultant, stat.ReleasedToWos, stat.AwaitingWosSignoff, stat.Current, stat.WosOverdues, stat.ConsultantOverdues ); } 

Lo estoy guardando como una matriz de bytes.

 using (ExcelPackage pck = new ExcelPackage()) { //Create the worksheet ExcelWorksheet ws = pck.Workbook.Worksheets.Add("AppraisalStatistic"); //Load the datatable into the sheet, starting from cell A1. ws.Cells["A1"].LoadFromDataTable(table, true); //Excel is properly formatted. //pck.SaveAs(new System.IO.FileInfo("C:\\Users\\Burton\\Desktop\\a.csv")); return pck.GetAsByteArray(); } 

Luego lo enviaré de return a Angular.

 var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(outputBytes) }; result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "AppraisalStatisics.csv" }; return result; 

Esto es lo que tengo para Angular. $ scope.statistics es la información que estoy enviando para formar el DataTable.

  $scope.getExcel = function () { AdminAjax.getAppraisalStatExcel($scope.statistics).then( function (byteData) { console.log(byteData); var anchor = angular.element('<a/>'); anchor.attr({ href: 'data:attachment/csv;charset=utf-8,' + encodeURIComponent(byteData), target: '_blank', download: 'AppraisalStatisics.csv' })[0].click(); }, function (errorResult) { console.log(errorResult); }); } 

Cuando se descarga el Excel, no es apropiado. Esto es lo que veo cuando abro la hoja de Excel.

  "PK}p�F�H��3[Content_Types].xml���J1�_e�U��D���U�>���vC��̴�oo6+""��z�$����3_�k����Њ�����ƆM+�Ö�[�C0�b�V��r1_RSf��gNwJ���ɘ0����kÞ¨zT�����10���!�{�`��Y���u+ %g5p�R�L4�""���]�an� ��Dft��z���4��4$<������""b�Y�&��/#�RF0�#�w�V���1�2?�/����G�����j""����*��evA��C:G1*���!�y�\��<�φoU�~� PK�H��3PK}p�F��닮'_rels/.rels����0�WYz��c��1�j��V�e�" o��b<xl���Ӳ^��=ч���"Ë�U�k���� Di��Ȣ��Uy�I�t����1��A�8Ë�C�6�Y�4zÃT�4��y~��Ӏ��-�7�֮�����gR�m�Q��H����e�/���h� �*���� PK��닮'PK}p�FU|��Wxl/workbook.xml���j�0D�����DI99P�K �@�����E$��UH?���C{�mfg�1�A|���wIn�PJn�7`YS�T��8B�����w�N�1��l��1@��d�Y�L�K2#t2 �fT��a����}z|�d�a�;��K�o�N����T���~͙���R�J�N�)?v��jÅ���]���:�ª���V�9��ϱmͲ��PKU|��WPK}p�F�b���4xl/_rels/workbook.xml.rels���j�0�_���8�`�Q��1��@�J�������k6VR(c���d��>���kÔ‰2�1h�]:����+(���D��rKJYa�'V�؀IoZ��4"W1Q(/m�#Jis��#v�u�����L�q��5��S���c���ޣ�)È}��ȞH sGb�:b�]��PAß—Y<R�e�_^M~�����1��I.��[�ǿ2��ګPK�b���4PK}p�F����hxl/worksheets/sheet1.xml���r�0�_E�{#lH�z�L�͡�C��ab�G���[}��Be�1���&��v��v���'|���Ð'rѲ>“#ڗ�j�m�����_�����h(�H὘�7R�g����]!؞�J�� ��|KX]�%]����^���=Nw�TG���|���\b�iQ %t�K��h{�U����G��~���#����'q�F盼3�q�dU���%��稢uq�����v�He���Q�"9;!e��8 "Ï«W���U�1�BrT����MLt��&�:�� _'�6�Db�:���'�Hm��Nd6��k����c���]%�M�^M�^M� �6�0z�@���a���8z�h�q�$���A�Z���@��Q��-�ms�)�;�bbL�Â����K'>�HL!1��5$n 1�#j]�.�9�_8w f���.��W��Bb��t(2�#^" &7o@��'��$�Ór}3�PK����hPK}p�F���Z "xl/styles.xml�T�n�0�W�?X|@��C�TB꥗�Ы 6XZ?d;����MD�J�������Һ衧ԡA��U�;��0�Ǟ" b���rb�2��)5��P�ڹI.v�W "�����R�D-�EGu���vž`JF������_�C�����w�%��xcxdK�(\�5��]�>�� X�<G'u5q�YO " �רi�I%�jFl��DgȘ/w�X����ap�(�R��������2����]���i�(��H���NI�NÉK�:R��|}���rC��h�+�Ӟ��7��0���@[鮫���� "g��S�%��[mv�u��¡��V���<!QlN�������j��/a�PK���ZPK}p�F���6�xl/shanetworkingStrings.xml}R�N1��Mߥȃ1�îˆ'��b|k����=�-�_o�FE;3�3�6���輶���^_RekM�\<-�/�xVT+c s��^��ȼg���s�0w7R���V����""���U�n-}�PÕ¾A���A�%[�I@eq.�5�~8���.2.�����Lr��=���" �`b2>M���Pc]�N-C��1����Ni�]��z��A������C�s����Q��dW�$}p�ĥ� �����Z�O����je�-%ÉŒ9���ea"-�H0���4&N.�1�V����3L^�ѱ� ���b��s[��M�����PK���6�PK-}p�F�H��3[Content_Types].xmlPK-}p�F��닮'Y_rels/.relsPK-}p�FU|��W@xl/workbook.xmlPK-}p�F�b���4Hxl/_rels/workbook.xml.relsPK-}p�F����hfxl/worksheets/sheet1.xmlPK-}p�F���Z "�xl/styles.xmlPK-}p�F���6�xl/shanetworkingStrings.xmlPK�� " 

Editar: parece que esta podría ser una respuesta para download a través de una request de AJAX. Sin embargo, estoy usando an y href.

EPPlus no genera files CSV, solo XLSX. Excel puede abrir el que generó localmente (la línea comentada) porque es un escenario muy común que busca específicamente: tome cualquier XLSX en su disco duro y renómbrelo a .csv y Excel lo abrirá, generalmente con una advertencia. .

Entonces, si el browser espera un csv según lo dictado por su flujo de respuesta y obtiene un file zip binary (que es lo que es un XLSX), no le va a gustar eso. Deberá ajustar su href para el context adecuado

Si todo lo que necesita es una salida de csv, realmente no necesita EPPlus plus, simplemente recorra la tabla. Hay muchas forms de hacerlo con los methods publicados aquí en stackoverflow:

Escribir un file CSV en .net