ASP.NET - Возможность экспортировать CSV / Excel в несколько листов? - PullRequest
2 голосов
/ 30 ноября 2011

Мне было интересно, есть ли у кого-нибудь решение, позволяющее экспортировать данные в Excel на нескольких листах ... На данный момент я знаю только, как экспортировать несколько объектов на один лист!

Я использую экспортер Devexpress ??Похоже, они этого не поддерживают, я тоже могу использовать универсальное решение?

Любое руководство будет с благодарностью!

Ответы [ 5 ]

0 голосов
/ 03 декабря 2011

Взгляните на http://www.devexpress.com/example=E2440 относительно вашего запроса.

Похоже, что именно вы ищете.

0 голосов
/ 30 ноября 2011

Я использую экспортер Devexpress ?? Похоже, они не поддерживают это, я Можно ли использовать универсальное решение?

Вы пытаетесь использовать свойство XlsxExportOptions.ExportMode ? Режим экспорта SingleFilePageByPage позволяет экспортировать документ постранично на несколько листов в одном и том же файле XLSX. Также ознакомьтесь со следующей статьей: Как экспортировать отчет на разные листы в файле XLS .

0 голосов
/ 30 ноября 2011

filepath, вероятно, должен быть server.mappath (), так как сгенерированный Excel должен быть сначала сохранен в пути к серверу и может быть разрешен для загрузки.
Добавьте ссылку Excel и добавьте пространство имен «Using Excel».

   public void Export(DataSet ds, string filePath)
    {
        string data = null;
        string columnName = null;
        int i = 0;
        int j = 0;
        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        //Excel.Worksheet xlWorkSheet;
        Excel.Worksheet xlWorkSheet = null;
        object misValue = System.Reflection.Missing.Value;
        Excel.Range range;

        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);
        //xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);


        for (int l = 0; l < ds.Tables.Count; l++)
        {
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(l + 1);                
            xlWorkSheet.get_Range("A1:D1", Type.Missing).Merge(Type.Missing);
            xlWorkSheet.get_Range("A1", "D1").Font.Bold = true;
            xlWorkSheet.Cells.Font.Name = "Courier New";

            for (i = 0; i <= ds.Tables[l].Rows.Count - 1; i++)
            {


                for (j = 0; j <= ds.Tables[l].Columns.Count - 1; j++)
                {
                    columnName = ds.Tables[l].Columns[j].ColumnName.ToString();
                    xlWorkSheet.Cells[3, j + 1] = columnName;
                    data = ds.Tables[l].Rows[i].ItemArray[j].ToString();
                    xlWorkSheet.Cells[i + 5, j + 1] = data;
                }
            }
        }

        xlWorkBook.SaveAs(filePath, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        // kill all excel processes
        Process[] pros = Process.GetProcesses();
        for (int p = 0; p < pros.Length; p++)
        {
            if (pros[p].ProcessName.ToLower().Contains("excel"))
            {
                pros[p].Kill();
                break;
            }
        }

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);
    }

    private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
        }
        finally
        {
            GC.Collect();
        }
    }
0 голосов
/ 30 ноября 2011

Я столкнулся с точно такой же проблемой в начале прошлого года. В конце концов мне удалось взломать мой путь к автоматическому созданию файла Excel .xlt с несколькими электронными таблицами (которые фактически являются веб-страницами), которые могут быть приняты Excel.

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

Выведите следующее (вы можете настроить любое количество листов):

MIME-Version: 1.0
X-Document-Type: Workbook
Content-Type: multipart/related; boundary="----=_NextPart_01CB53EC.0FFDF540"

------=_NextPart_01CB53EC.0FFDF540
Content-Location: file:///C:/CE594991/Book1.htm
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=utf-8"

<html xmlns:v=3D"urn:schemas-microsoft-com:vml"
xmlns:o=3D"urn:schemas-microsoft-com:office:office"
xmlns:x=3D"urn:schemas-microsoft-com:office:excel"
xmlns=3D"http://www.w3.org/TR/REC-html40">

<head>

<link id=3D"shLink" href=3D"Book1_files/Sheet1.htm">
<link id=3D"shLink" href=3D"Book1_files/Sheet2.htm">
<link id=3D"shLink" href=3D"Book1_files/Sheet3.htm">

<xml>
 <x:ExcelWorkbook>
  <x:ExcelWorksheets>
   <x:ExcelWorksheet>
    <x:Name>Sheet1</x:Name>
    <x:WorksheetSource HRef=3D"Book1_files/Sheet1.htm"/>
   </x:ExcelWorksheet>
   <x:ExcelWorksheet>
    <x:Name>Sheet2</x:Name>
    <x:WorksheetSource HRef=3D"Book1_files/Sheet2.htm"/>
   </x:ExcelWorksheet>
   <x:ExcelWorksheet>
    <x:Name>Sheet3</x:Name>
    <x:WorksheetSource HRef=3D"Book1_files/Sheet3.htm"/>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
 </x:ExcelWorkbook>
</xml>
</head>

</html>

Для каждой страницы выведите:

------=_NextPart_01CB53EC.0FFDF540
Content-Location: file:///C:/CE594991/Book1_files/{ your sheet name }".htm
Content-Type: text/html; charset=utf-8

<html>
{ your stuffs }
</html>

Конец цикла

------=_NextPart_01CB53EC.0FFDF540
Content-Location: file:///C:/CE594991/Book1_files/filelist.xml
Content-Transfer-Encoding: quoted-printable
Content-Type: text/xml; charset="utf-8"

<xml xmlns:o=3D"urn:schemas-microsoft-com:office:office">
 <o:MainFile HRef=3D"../Book1.htm"/>
 <o:File HRef=3D"Sheet1.htm"/>
 <o:File HRef=3D"Sheet2.htm"/>
 <o:File HRef=3D"Sheet3.htm"/>
</xml>
------=_NextPart_01CB53EC.0FFDF540--

В вашем коде установите для буфера ответа значение false, тип содержимого - «application / vnd.ms-excel» и добавьте заголовок «Content-Disposition», «inline; filename = {имя вашего файла}». Обратите внимание, что перед первой строкой вашего выходного файла не должно быть разрывов строк.

0 голосов
/ 30 ноября 2011

Epplus?

http://epplus.codeplex.com/releases/view/42439

Я использовал это в приложении winforms, и это здорово. Он работает только с файлами xlsx - например, Excel 2007 и выше.

андрей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...