zoukankan      html  css  js  c++  java
  • (开发篇) 批量导入导出~ 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

  • 相关阅读:
    JS中关于clientWidth offsetWidth scrollWidth 等的含义
    javascript中数组concat()join()split()
    我的大数据学习路线(持续更新)
    java多线程-学习笔记
    java多线程-线程交互&互斥&同步
    java多线程-关键人物程咬金
    java多线程-军队战争
    java多线程-两个演员线程
    pytorch-Flatten操作
    龙良曲pytorch学习笔记_迁移学习
  • 原文地址:https://www.cnblogs.com/phoenixfling/p/2651285.html
Copyright © 2011-2022 走看看