导入导出功能一般是安装第三方组件实现的。
安装微软的Office太不友好就不考虑了,简单说下一般方法。
导入
导入的话可以使用组件。使用NPOI组件是一个不错的选择。NPOI官网教程http://npoi.codeplex.com/SourceControl/latest
导出
导出分两种情况:本地Excel文件导出的话直接导出就ok了,但是一般是从数据库读取数据后导出为Excel文件的。使用上面的组件NPOI也可以。这里介绍另一种方法:导出CSV文件。
什么是CSV文件?
- CSV是字符分隔值文件。
- 一般以英文逗号分割一行的值。
- 纯文本文件被广泛地兼容。
建立一个txt文件,后缀名改为csv,可以看见默认是用Excel打开的。开打效果和xls文件一样。
思路:将数据使用逗号和换行符拼接成字符串,转化为字节数组,然后设置输出的Header头文件的字节长度、Mime类型为Excel、文件名,然后输出字节数组。
/// <summary>
/// 输出CSV文件
/// </summary>
public class ExcelHelper
{
public void ExportExcel(DataTable dt)
{
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms, Encoding.GetEncoding("GB2312"));
StringBuilder strbu = new StringBuilder();
//标题
for (int i = 0; i < dt.Columns.Count; i++)
{
strbu.Append(dt.Columns[i].ColumnName.ToString() + "\t");
}
//加入换行字符串
strbu.Append(Environment.NewLine);
//写入内容
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
strbu.Append(dt.Rows[i][j].ToString() + "\t");
}
strbu.Append(Environment.NewLine);
}
sw.Write(strbu.ToString());
sw.Flush();
sw.Close();
sw.Dispose();
//转换为字节数组
byte[] bytes = ms.ToArray();
ms.Close();
ms.Dispose();
OutputClient(bytes);
}
public void OutputClient(byte[] bytes)
{
HttpResponse response = HttpContext.Current.Response;
response.Buffer = true;
response.Clear();
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Length",bytes.Length.ToString());
response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")));
response.Charset = "GB2312";
response.ContentEncoding = Encoding.GetEncoding("GB2312");
response.BinaryWrite(bytes);
response.Flush();
response.Close();
}
}
CSV注意点:
- 1.数字都以科学计数法来标记。要将数字转化为文本类型请使用英文的单引号。
- 2.空值单元格也要写。
- 3.其它详情请查阅相关文件。