您的位置:首页 > 其它

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

2012-08-23 11:41 549 查看
(原创,转载请标明出处)

需求说明: 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 的引用?

解答:

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

解答:选择COM里面选择Microft Office 12.0 object Library
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: