(开发篇) 批量导入导出~ Excel导出方法汇总(原创)

(原创,转载请标明出处)

需求说明:  1.根据所选择条件的不同产生不同的参数,并将这些参数作为列名导出为Excel表(先写入dt_rllxparam)--导入模板.xls

     2.然后由用户往 导入模板.xls 插入数据并上传至服务器

需求分析: 1.导出的excel中只有列名,且为动态(已写入dt_rllxparam表中)

     2.导入的excel要使用excel标准格式,方可导入,使用html格式无法导入

excel导出方案1--将Gridview控件导出为excel(本质是往html中写入一个gridview,然后再将html response到excel中,即excel是html格式的)

            //由于dt_rllxparam表里面只有列名,于是增加一个空行表示数据       

        DataRow dr_rllxparam = dt_rllxparam.NewRow();

            dt_rllxparam.Rows.Add(dr_rllxparam);



            //gridview导出到excel表中

            Response.Clear();

            Response.Buffer = true;

            Response.Charset = "GB2312";//设置类型,中文防止乱码出现,也可以是utf-8

            Response.ContentType = "application/vnd.ms-excel";//设置输出类型为excel,也有写application/vnd.ms-excel的

            Response.ContentEncoding = System.Text.Encoding.Default; //System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文,感觉可有可无的一项

            Response.AppendHeader("Content-Disposition", "attachment;filename=Sheet1.xls");//定义输出文件和文件名,感觉可有可无的一项

            this.EnableViewState = false;

            StringWriter sw = new StringWriter();

            HtmlTextWriter htw = new HtmlTextWriter(sw);



            DataGrid dg = new DataGrid();//往文件流中插入一个控件

            dg.DataSource = dt_rllxparam;

            dg.DataBind();

            dg.RenderControl(htw);

            Response.Write(sw.ToString());

            Response.End();

excel导出方案2--将dt_rllxparam直接导出为excel(本质是往html中写入一个带格式的string,然后再将html response到excel中,即excel是html格式的)

    //将dt导出到excel表中,html格式,逐行导入

    public void CreateExcel(System.Data.DataTable dt, string FileName)

    {

        HttpResponse resp;

        resp = Page.Response;

        resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");

        resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);

        string colHeaders = "", ls_item = "";

        DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的



        int i = 0;

        int cl = dt.Columns.Count;

        for (i = 0; i < cl; i++)

        {

            if (i == (cl - 1))//最后一列,加n

            {

                //最后一个单元格换行

                colHeaders += dt.Columns[i].Caption.ToString() + "\n";

            }



            else

            {

                //除最后一个单元格以外的单元格横向换格

                colHeaders += dt.Columns[i].Caption.ToString() + "\t";

            }



        }

        resp.Write(colHeaders);

        //向HTTP输出流中写入取得的数据信息 



        //逐行处理数据

        foreach (DataRow row in myRow)

        {

            //当前行数据写入HTTP输出流,并且置空ls_item以便下行数据     

            for (i = 0; i < cl; i++)

            {

                if (i == (cl - 1))//最后一列,加n

                {

                    //最后一个单元格换行

                    ls_item += row.ToString() + "\n";

                }

                else

                {

                    //除最后一个单元格以外的单元格横向换格

                    ls_item += row.ToString() + "\t";

                }

            }

            resp.Write(ls_item);

            ls_item = "";

        }

        resp.End();

    }

excel导出方案2--将dt_rllxparam直接导出为excel

(本质是往一个已有的excel中写入所需要的数据,然后再将这个写好的数据另存出来,优势在于如此导出的excel是标准格式)

切记需要引用

using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Core;  //选择COM里面选择Microft Office 12.0 object Library
using System.Reflection;//定义_open()内参数必须要用它。否则就出现missing未定义的错误。
using System.IO;

并安装一下office.excel

    //将dt导出到excel表中,标准excel格式

    public void ExportExcel(System.Data.DataTable dt_rllxparam,string filename)

    {

        //复制表style到temp文件夹下,(源文件地址,保存文件地址,第三个参数若为true,那么目标位置存在同名文件将被覆盖)

        //File.Copy(Server.MapPath("style.xls"), Server.MapPath("tempExcel\\" + filename+".xls"), false);

        //向Excel中写入数据,

        Microsoft.Office.Interop.Excel.Application excelApp = null;//引用Excel对象

        Microsoft.Office.Interop.Excel.Workbook workBook;          //引用工作薄

        Microsoft.Office.Interop.Excel.Worksheet ws = null;        //引用工作表的操作作

        try

        {

            excelApp = new Microsoft.Office.Interop.Excel.Application();

            //_open(),()中的参数必须写完,不然会出现open中至少定义一个参数的错误,没有,就missing.value或者missing。

            workBook = excelApp.Workbooks._Open(Server.MapPath("~/PARAMETER_mannager/excelModel/空模板.xls"), Missing.Value, Missing.Value,Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,Missing.Value, Missing.Value);//连接到目录下的Excel文件



            //打开第一张工作表sheet1

            ws = (Worksheet)workBook.Worksheets[1];

            //Microsoft.Office.Interop.Excel.Worksheet ws = (Worksheet)workBook.Worksheets[1];

            for (int i = 0; i < dt_rllxparam.Columns.Count; i++)

            {

                //"'"是定义字符串形式

                ws.Cells[1, i + 1] = "'" + dt_rllxparam.Columns[i].Caption.ToString();

            }

            string tmpPath = Server.MapPath("~/PARAMETER_mannager/excelModel") + "\\" + filename + ".xls";//保存路径



            //在保存之前,先删除掉原来的临时模板

            FileInfo file = new FileInfo(tmpPath);

            file.Delete();

            //保存Excel

            ws.SaveAs(tmpPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

            //关闭Excel

            excelApp.Quit();



            //打开下载对话框下载

            string strDownPath = "<script language='javascript'>window.open('excelModel/" + filename + ".xls')</script>";//

            Response.Write(strDownPath);

        }

        //捕捉异常

        catch (Exception ex)

        {

            throw ex;

        }

        return;

    }

 2014-06-29遇到问题:

1.错误 5 找不到编译动态表达式所需的一种或多种类型。是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用? 

解答:

用记事本打开专案资料夹里的 *.csproj
找到<ItemGroup>区段
手动加入
<Reference Include= "Microsoft.CSharp" />
<Reference Include= "System.Core" />

2.错误 1 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Core”。是否缺少程序集引用? 

解答:选择COM里面选择Microft Office 12.0 object Library

 

你可能感兴趣的:(Excel)