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

时间:2024-03-05 18:33:25

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

需求说明:  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