请问如何从GridView里面把数据导出到OpenOffice下的.ods格式文件里面?我现在只知道怎么导出到Excel里面,但是客户用的是OpenOffice,所以需要导出到.ods里面。如果直接导出.xls文件,打开了是一些乱码。不知道这个问题怎么解决,请教CSDN牛人?

解决方案 »

  1.   

    public class ExportExcel
        {        public static void PrepareGridViewForExport(Control gv)
            {            LinkButton lb = new LinkButton();            Literal l = new Literal();            string name = String.Empty;            for (int i = 0; i < gv.Controls.Count; i++)
                {                if (gv.Controls[i].GetType() == typeof(LinkButton))
                    {                    l.Text = (gv.Controls[i] as LinkButton).Text;                    gv.Controls.Remove(gv.Controls[i]);                    gv.Controls.AddAt(i, l);                }                else if (gv.Controls[i].GetType() == typeof(DropDownList))
                    {                    l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;                    gv.Controls.Remove(gv.Controls[i]);                    gv.Controls.AddAt(i, l);                }                else if (gv.Controls[i].GetType() == typeof(CheckBox))
                    {                    l.Text = (gv.Controls[i] as CheckBox).Checked ? "True" : "False";                    gv.Controls.Remove(gv.Controls[i]);                    gv.Controls.AddAt(i, l);                }                if (gv.Controls[i].HasControls())
                    {                    PrepareGridViewForExport(gv.Controls[i]);                }            }
            }        public static void ExportGridView(GridView GridView1, string filename)
            {            string attachment = "attachment; filename=" + filename + ".xls";            HttpResponse Response = HttpContext.Current.Response;            Response.ClearContent();
                Response.Charset = "utf-8"; 
                Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
                Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
                Response.AddHeader("content-disposition", attachment);            Response.ContentType = "application/ms-excel";            StringWriter sw = new StringWriter();            HtmlTextWriter htw = new HtmlTextWriter(sw);
                // Create a form to contain the grid            HtmlForm frm = new HtmlForm();            GridView1.Parent.Controls.Add(frm);            frm.Attributes["runat"] = "server";            frm.Controls.Add(GridView1);
                frm.RenderControl(htw);            //GridView1.RenderControl(htw);            Response.Write(sw.ToString());            Response.End();
            }
        }    protected void Button1_Click(object sender, EventArgs e)
        {
            BindAllTeaInfo();
            this.GridView1.AllowPaging = false;
            this.GridView1.DataBind();
            //上面的是当你有分页时就可以加上去,BindGridView函数里又变回去,
            ExportExcel.PrepareGridViewForExport(GridView1);
            ExportExcel.ExportGridView(GridView1, "周奖");    }
    这个是解决乱码的问题
      

  2.   

    网上找个,只要把数据转换成datatable,我用过,导出到excel,word都行!
      

  3.   

    string _xmlStr = @"<?xml version='1.0'?>
                        <?mso-application progid='Excel.Sheet'?>
                        <Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet'
                         xmlns:o='urn:schemas-microsoft-com:office:office'
                         xmlns:x='urn:schemas-microsoft-com:office:excel'
                         xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet'
                         xmlns:html='http://www.w3.org/TR/REC-html40'>
                         <DocumentProperties xmlns='urn:schemas-microsoft-com:office:office'>
                          <Author>aa</Author>
                          <LastAuthor>aa</LastAuthor>
                          <Created>2007-12-07T06:54:38Z</Created>
                          <Company>WZKJ</Company>
                          <Version>11.5606</Version>
                         </DocumentProperties>
                         <ExcelWorkbook xmlns='urn:schemas-microsoft-com:office:excel'>
                          <WindowHeight>5970</WindowHeight>
                          <WindowWidth>7395</WindowWidth>
                          <WindowTopX>480</WindowTopX>
                          <WindowTopY>60</WindowTopY>
                          <ProtectStructure>False</ProtectStructure>
                          <ProtectWindows>False</ProtectWindows>
                         </ExcelWorkbook>
                         <Styles>
                          <Style ss:ID='Default' ss:Name='Normal'>
                           <Alignment ss:Vertical='Center'/>
                           <Borders/>
                           <Font ss:FontName='宋体' x:CharSet='134' ss:Size='12'/>
                           <Interior/>
                           <NumberFormat/>
                           <Protection/>
                          </Style>
                          <Style ss:ID='s21'>
                            <Alignment ss:Vertical='Center' ss:WrapText='1'/>
                          </Style>
                         </Styles>
                         <Worksheet ss:Name='Sheet1'>
                          $Table$
                          <WorksheetOptions xmlns='urn:schemas-microsoft-com:office:excel'>
                           <Selected/>
                           <Panes>
                            <Pane>
                             <Number>3</Number>
                             <ActiveRow>2</ActiveRow>
                             <ActiveCol>3</ActiveCol>
                            </Pane>
                           </Panes>
                           <ProtectObjects>False</ProtectObjects>
                           <ProtectScenarios>False</ProtectScenarios>
                          </WorksheetOptions>
                         </Worksheet>
                         
                        </Workbook>";
            
            string sqlStr = String.Format("select * from table where ID in({0})",IDStr);        int recordCount = 0;//记录数
            string outputStr = "";//保存要输出的数据部分
            using (SqlDataReader dr = conn.GetDataReader(sqlStr))
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("<Column ss:Index='1' ss:AutoFitWidth='0' ss:Width='33.75'/>");
                sb.Append("<Column ss:Index='2' ss:AutoFitWidth='0' ss:Width='93.75'/>");
                sb.Append("<Column ss:Index='3' ss:AutoFitWidth='0' ss:Width='153.75'/>");
                sb.Append("<Column ss:Index='4' ss:AutoFitWidth='0' ss:Width='273.75'/>");
                sb.Append("<Column ss:Index='5' ss:AutoFitWidth='0' ss:Width='63.75'/>");
                sb.Append("<Column ss:Index='6' ss:AutoFitWidth='0' ss:Width='93.75'/>");
                sb.Append("<Column ss:Index='7' ss:AutoFitWidth='0' ss:Width='93.75'/>");
                sb.Append("<Column ss:Index='8' ss:AutoFitWidth='0' ss:Width='63.75'/>");
                sb.Append("<Column ss:Index='9' ss:AutoFitWidth='0' ss:Width='153.75'/>");
                sb.Append("<Column ss:Index='10' ss:AutoFitWidth='0' ss:Width='153.75'/>");
                sb.Append("<Column ss:Index='11' ss:AutoFitWidth='0' ss:Width='153.75'/>");
                sb.Append("<Row>");
                sb.Append("<Cell><Data ss:Type='String'>序号</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名导</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("<Cell><Data ss:Type='String'>列名</Data></Cell>");
                sb.Append("</Row>");
                while (dr.Read())
                {
                    recordCount = recordCount + 1;
                    sb.Append("<Row ss:StyleID='s21'>");
                    sb.Append("<Cell><Data ss:Type='String'>" + recordCount.ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("<Cell><Data ss:Type='String'>" + dr["字段"].ToString() + "</Data></Cell>");
                    sb.Append("</Row>");
                }
                outputStr = sb.ToString();
            }        string topString = "<Table ss:ExpandedColumnCount='11' ss:ExpandedRowCount='" + Convert.ToString(recordCount + 1) + "' x:FullColumns='1' x:FullRows='1' ss:DefaultColumnWidth='54'>";
            string bottomStr = "</Table>";
            string ExcelXmlStr = _xmlStr.Replace("$Table$", topString + outputStr + bottomStr);        Response.Clear();
            Response.Buffer = true;
            Response.AddHeader("Content-Disposition", "attachment;filename=Work_Report.xls");
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
            Response.ContentType = "application/ms-excel";
            Response.Output.Write(ExcelXmlStr);
            Response.Flush();
            Response.End();看看这个吧,对你应该有帮助的,用Excel2007和Excel2003打开都没问题,主要是要对Excel的XML熟悉一下就可以了
      

  4.   


    谢谢你的费心,但是我需要的是放到OpenOffice下的.ods格式文件里能正常打开。我现在的功能放到Excel里面是可以正常打开的。就是不知道.ods怎么弄,再一次谢谢你。
      

  5.   

    请问有方法觉得这问题了吗?
    现在我面对了这个问题...
    求助... >.<
      

  6.   


    我的问题是
    必须导出.xls然后支援ms excel和openoffice calc
    问题是在openoffice里它只显示html
    并不是table form
      

  7.   

    跪求答案
    很紧急的问题
    拜托了各位大大
    >.<