使用AngularJS和EPPlus生成CSV的问题

时间:2015-07-30 19:58:06

标签: angularjs excel csv asp.net-web-api epplus

我正在将一个对象数组发送回服务器(WebApi),使用EEPlus来执行ExcelPackage.GetAsByteArray();然后将其发送回AngularJS前端。

我将信息存储在DataTable中以开始。

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

我将其保存为字节数组。

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

然后我将它发回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;

这就是我对Angular的看法。 $ scope.statistics是我发送回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);
            });
    }

下载Excel时,不正确。这就是我打开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/sharedStrings.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/sharedStrings.xmlPK�� "   

编辑:似乎这可能是通过AJAX请求下载的响应。但是,我正在使用和href。

1 个答案:

答案 0 :(得分:1)

EPPlus不会生成CSV文件 - 仅限XLSX。 Excel可以打开你在本地生成的那个(注释掉的行),因为它是一个非常常见的场景,它特别注意 - 在硬盘上取任何XLSX并将其重命名为.csv,excel将打开它,通常带有警告。

因此,如果浏览器期望响应流所指示的csv并获得二进制zip文件(这就是XLSX),那就不会那样了。您必须根据正确的上下文调整href

如果你需要的只是一个csv输出你真的不需要EPPlus加 - 只需循环遍历表格。使用stackoverflow上发布的方法有很多方法可以做到这一点:

Writing a CSV file in .net