1) Как написать Excel в поток памяти .... 2) Как загрузить файл Excel из браузера .... с помощью Micosoft.Office.Interop.Excel и c # - PullRequest
0 голосов
/ 13 января 2012
//i'm using VS 2008, dll as Microsoft.Office.Interop.Excel
//sample code..
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;

object misValue = System.Reflection.Missing.Value;                
xlApp = new Excel.ApplicationClass();                
xlWorkBook = xlApp.Workbooks.Add(misValue);//create new work book
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

//CREATING ONE Rectangle shape
xlWorkSheet.Shapes.AddShape(MsoAutoShapeType.msoShapeRectangle, 47, 24, 500, 90);
 Microsoft.Office.Interop.Excel.Shape[] myShapes = new Microsoft.Office.Interop.Excel.Shape[1];
 //adding textbox
 myShapes[0] = xlWorkSheet.Shapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, 75, 60, 70, 30);
myShapes[0].TextFrame.Characters(misValue, misValue).Text = "Tracking";

// опция загрузки из браузера.

context.Response.ContentType = "application/vnd.ms-excel";
context.Response.AddHeader("Content-Disposition", "attachment; filename= report.xls");

// здесь я использую временный текстовый файл. Но мне нужно без использования временного файла ..

string file = context.Server.MapPath("new.txt");
 Byte[] myByte = File.ReadAllBytes(file);

  context.Response.Clear();
  context.Response.BinaryWrite(myByte);
  context.Response.Flush();
  context.Response.Close();

Можем ли мы использовать интерфейс Ipersiststream для сохранения объектов в потоке памяти?

http://www.eggheadcafe.com/community/csharp/2/10101323/how-to-implement-ipersiststream-interface-in-c.aspx

Ответы [ 2 ]

1 голос
/ 20 января 2012

Если вы заинтересованы в создании документа Excel с большим форматированием, чем GridView, вы можете взглянуть на EPPlus:

http://epplus.codeplex.com/

Библиотека способна создавать файлы Excel с возможностью настройки ячеек, форматов и т. Д.

Если GridView работает для вас, перейдите на него, но если нет, есть другие параметры Excel. Вы должны иметь возможность сохранять содержимое в потоке памяти и выводить поток памяти в браузер.

Вот пример обработчика FileResult, который я использовал с ASP.NET MVC. Эта концепция может быть применена к WebForms, все, что она делает, это записывает в поток ответов. У моего класса есть свойство для загрузки данных (this.dataTable) и имя файла, который браузер должен загрузить как (fileName), и имя рабочей книги (this.workBookName)

    protected override void WriteFile(HttpResponseBase response)
    {
        using (ExcelPackage pck = new ExcelPackage())
        {

            ExcelWorksheet ws = pck.Workbook.Worksheets.Add(this.workBookName);

            ws.Cells["A1"].LoadFromDataTable(this.dataTable, true);

            response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            response.AddHeader("content-disposition", "attachment;  filename=" + fileName);
            response.BinaryWrite(pck.GetAsByteArray());

        }
    }
0 голосов
/ 13 января 2012

Я полностью согласен с Джоном Сондерсом, может быть, вы должны попробовать этот путь.

Свяжите набор данных с GridView, а затем загрузите его в Excel.

Используйте приведенный ниже сегмент кода для получения значения из элемента управления

private static void PrepareControlForExport(Control control)
    {
        for (int i = 0; i < control.Controls.Count; i++)
        {
            Control current = control.Controls[i];
            if (current is LinkButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
            }
            else if (current is ImageButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
            }
            else if (current is HyperLink)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
            }
            else if (current is DropDownList)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
            }
            else if (current is CheckBox)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
            }

            if (current.HasControls())
            {
                PrepareControlForExport(current);
            }
        }
    }

Теперь создайте метод, который будет загружать данные из gridview.

private void ExportX()
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; Filename = ExcelReport.xls"));
        Response.Charset = "";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.ContentType = "application/ms-excel";
        StringWriter stringWrite = new StringWriter();
        HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWrite);
        Table table = new Table();

        //  include the gridline settings
        table.GridLines = GridView1.GridLines;
        if (GridView1.HeaderRow != null)
        {
            PrepareControlForExport(GridView1.HeaderRow);
            table.Rows.Add(GridView1.HeaderRow);
        }
        foreach (GridViewRow row in GridView1.Rows)
        {
            PrepareControlForExport(row);
            table.Rows.Add(row);
        }
        if (GridView1.FooterRow != null)
        {
            PrepareControlForExport(GridView1.HeaderRow);
            table.Rows.Add(GridView1.FooterRow);
        }

        table.RenderControl(htmlWriter);
        Response.Write(stringWrite.ToString());
        Response.End();
    }



public override void VerifyRenderingInServerForm(Control control)
    {

    }

Это все, что вам нужно сделать, вызвать вышеуказанный метод для загрузки данных.

...