asp.net使用组件koogra读取Excel数据批量上传导入

介绍使用.NET组件koogra实现Excel批量上传的方法,支持多种参数传递方式,并提供错误处理。

本文使用.NET开源组件koogra实现读取excel内容批量上传,在企业应用中经常会遇到批量上传数据的需求,客户要求使用excel表格录入一批数据,然后通过网页上传该excel表格,实现批量导入数据。这样的需求其实主要就是处理Excel表格,把Excel表格中的内容读取出来后,做一些必要的校验,然后上传校验成功的数据,返回失败数据的行号以及校验失败的信息。

koogra项目组件下载地址:

http://sourceforge.net/projects/koogra/

下面开始我们的封装过程,为了好用我希望的方式是四种,返回的结果都是DataTable对象。

1:传入的参数包括工作簿地址、工作表名称;

2:传入的参数包括工作簿地址、工作表的索引(0表示第一个工作表);

3:传入的参数包括内存流、工作表名称;

4:传入的参数包括内存流、工作表的索引(0表示第一个工作表)。

开始上代码,记得项目要引用Ionic.Utils.Zip.dll和Net.SourceForge.Koogra.dll


Code [http://www.oeedu.com]



  
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using Net.SourceForge.Koogra.Excel;

namespace Gren.Framework.Office
{
/// <summary>
/// Excel工具类
/// </summary>
public class ExcelUtils
{
private Workbook book;

public ExcelUtils( string path)
{
this .book = new Workbook(path);
}

public ExcelUtils(System.IO.Stream stream)
{
this .book = new Workbook(stream);
}

protected DataTable SaveAsDataTable(Worksheet sheet)
{
DataTable dt = new DataTable();

uint minRow = sheet.Rows.MinRow;
uint maxRow = sheet.Rows.MaxRow;

Row firstRow = sheet.Rows[minRow];

uint minCol = firstRow.Cells.MinCol;
uint maxCol = firstRow.Cells.MaxCol;

for ( uint i = minCol; i <= maxCol; i )
{
dt.Columns.Add(firstRow.Cells[i].FormattedValue());
}

for ( uint i = minRow 1 ; i <= maxRow; i )
{
Row row = sheet.Rows[i];

if (row != null )
{
DataRow dr = dt.NewRow();

for ( uint j = minCol; j <= maxCol; j )
{
Cell cell = row.Cells[j];

if (cell != null )
{
dr[Convert.ToInt32(j)] = cell.Value != null ? cell.Value.ToString() : string .Empty;
}
}

dt.Rows.Add(dr);
}

}

return dt;
}

public DataTable ToDataTable( int index)
{
Worksheet sheet = this .book.Sheets[index];

if (sheet == null )
{
throw new ApplicationException( string .Format( " 索引[{0}]所指定的电子表格不存在! " , index));
}

return this .SaveAsDataTable(sheet);
}

public DataTable ToDataTable( string sheetName)
{
Worksheet sheet = this .book.Sheets.GetByName(sheetName);

if (sheet == null )
{
throw new ApplicationException( string .Format( " 名称[{0}]所指定的电子表格不存在! " , sheetName));
}

return this .SaveAsDataTable(sheet);
}

#region 静态方法

/// <summary>
/// 单元格格式为日期时间,使用此方法转换为DateTime类型,若解析失败则返回‘0001-01-01’
/// </summary>
public static DateTime ParseDateTime( string cellValue)
{
DateTime date = default (DateTime);

double value = default ( double );

if ( double .TryParse(cellValue, out value))
{
date = DateTime.FromOADate(value);
}
else
{
DateTime.TryParse(cellValue, out date);
}

return date;
}

/// <summary>
/// 转换为DataTable(文件路径 表名)
/// </summary>
public static DataTable TranslateToTable( string path, string sheetName)
{
ExcelUtils utils = new ExcelUtils(path);
return utils.ToDataTable(sheetName);
}

/// <summary>
/// 转换为DataTable(文件路径 表索引)
/// </summary>
public static DataTable TranslateToTable( string path, int sheetIndex)
{
ExcelUtils utils = new ExcelUtils(path);
return utils.ToDataTable(sheetIndex);
}

/// <summary>
/// 转换为DataTable(文件路径)
/// </summary>
public static DataTable TranslateToTable( string path)
{
ExcelUtils utils = new ExcelUtils(path);
return utils.ToDataTable( 0 );
}

/// <summary>
/// 转换为DataTable(内存流 表名)
/// </summary>
public static DataTable TranslateToTable(System.IO.Stream stream, string sheetName)
{
ExcelUtils utils = new ExcelUtils(stream);
return utils.ToDataTable(sheetName);
}

/// <summary>
/// 转换为DataTable(内存流 表索引)
/// </summary>
public static DataTable TranslateToTable(System.IO.Stream stream, int sheetIndex)
{
ExcelUtils utils = new ExcelUtils(stream);
return utils.ToDataTable(sheetIndex);
}

/// <summary>
/// 转换为DataTable(内存流)
/// </summary>
public static DataTable TranslateToTable(System.IO.Stream stream)
{
ExcelUtils utils = new ExcelUtils(stream);
return utils.ToDataTable( 0 );
}

#endregion
}
}

ParseDateTime这个静态方法是用来处理日期时间类型单元格的,在Excel表格里面日期时间类型读取出来的时候是一个double类型的数据,使用这个方法可以得到正确的DataTime类型的值。仔细的人可以发现这个方法其实除了把double类型的数据转换为DateTime之外,还会在转换失败的时候尝试把该单元格的内容做为字符串转换为DateTime,因为如果单元格是文本类型的话,那么用户输入的日期时间就不是一个double了。

好了,读取Excel的类就封装好了,那么在asp.net页面中如何使用呢?再看下面的代码,fileUpload1是文件上传控件。


Code [http://www.oeedu.com]



  
if (fileUpload1.HasFile)
{
DataTable dt = null ;

try
{
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(fileUpload1.FileBytes))
{
dt = Gren.Framework.Office.ExcelUtils.TranslateToTable(stream, " sheet1 " );
}

// 得到DataTable对象后,做你自己的处理
}
catch (Exception ex)
{
lblMessage.Text = " <p><span class=/"c_red ft_bold/">处理数据文件错误:</span></p> " ;
lblMessage.Text = " <div class=/"c_red/"> " Server.HtmlEncode(ex.Message) " </div> " ;
}
}
else
{
lblMessage.Text = " <p><span class=/"c_red ft_bold/">请选择数据文件</span></p> " ;
}

直接用内存流来处理上传的文件还是比较快的,大家试试吧.

Free Spire.XLS for .NET 是 Spire.XLS for .NET 的免费版本,无需购买即可用于个人或商业用途。使用 Free Spire.XLS for .NET,开发人员可以在 .NET 应用程序中快速对 Excel 文档进行各种编程操作,如根据模板创建新的 Excel 文档,编辑现有 Excel 文档以及对 Excel 文档进行转换等。Free Spire.XLS for .NET 是 Spire.XLS for .NET 的免费版本,无需购买即可用于个人或商业用途。使用 Free Spire.XLS for .NET,开发人员可以在 .NET 应用程序中快速对 Excel 文档进行各种编程操作,如根据模板创建新的 Excel 文档,编辑现有 Excel 文档以及对 Excel 文档进行转换等。 主要功能如下: 1.100% 独立的 .NET 组件,无需 Microsoft Office Automation 2.强大的,高质量的 Excel 文件转换功能。支持将 Excel 文档快速高效地转换为多种常见的格式,如 XML,Text,PDF 和图片等。 3.使用全面的工作簿设计器创建 Excel 报表。支持开发人员新建 Excel 工作簿,从文件流或文件夹加载工作簿。还可以将工作薄保存到磁盘, 文件流或 Web Response,同时提供了多种安全功能,包括 Excel 加密/解密,单元格隐藏/取消隐藏,工作表锁定/解锁。 4.自由操作工作表。允许开发人员使用 C#、VB.NETASP.NET 来创建、添加、删除、重命名、编辑和移动工作表,开发人员还可以在多个充满数据的工作表之间进行复制、调换和合并操作。这个专业的 .NET Excel 类库嵌入了很多灵活显示工作表的选项,包括分页符,缩放设置,冻结窗口,页眉/页脚,打印 Excel 文件,打印页面尺寸和打印区域等。 5.在运行时轻松操作单元格和 Excel 计算引擎。开发人员可以在运行时使用 C#、VB.NETASP.NET 轻松地操作 Excel 单元格,计算公式值。该高速、可扩展的 Excel 计算引擎与 Excel 97-2003/2007/2010 等兼容。同时该组件支持设置单元格样式,如单元格的合并/拆分,文字环绕/取消环绕,文本排列和旋转、边框、锁定/解除等。字体格式,如设置字体类型、大小、颜色、粗体、斜体、删除线、下划线等等。条件格式,文本搜索和替换,过滤和数据验证等操作都可以轻松的应用到单元格中。 6.图表、数据和其它元素。提供了一组丰富的图表,如饼状图,条形图,柱形图,折线图和雷达图等。此外,它支持使用 C#、VB.NETASP.NET数据库和 Excel 之间进行数据传输,支持超链接和模板,支持创建和获取数据透视表。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值