真爱无限的知识驿站

学习积累技术经验,提升自身能力

Excel文件与DataSet之间的转化的探索与实现

.net操作Excel的支持库下载 NPOI2.0.1.zip


以前用过依赖于office的方法对Excel文件进行操作,在自己机器上运行正常,到服务器上就不能运行。

这个问题困扰了我好久,终于找到了好的解决方法 。

使用不依赖于office的外部dll来操作Excel。。


首先,我自己建立的类,NpoiHelper,用来进行Excel与DataSet之间的转化,放于自己的类库Tools中

类的内容如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using NPOI.HSSF.UserModel;
using System.Data;
using System.Collections;
namespace Tools
{
    /// <summary>
    /// Excel文件到DataSet的转换类
    /// </summary>
    public class NpoiHelper
    {
        #region 读取Excel文件内容转换为DataSet
        /// <summary>
        /// 读取Excel文件内容转换为DataSet,列名依次为 "c0"……c[columnlength-1]
        /// </summary>
        /// <param name="FileName">文件绝对路径</param>
        /// <param name="startRow">数据开始行数(1为第一行)</param>
        /// <param name="ColumnDataType">每列的数据类型</param>
        /// <returns></returns>
        public static DataSet ReadExcel(string FileName, int startRow, params datatype[] ColumnDataType)
        {
            int ertime = 0;
            int intime = 0;
            DataSet ds = new DataSet("ds");
            DataTable dt = new DataTable("dt");
            DataRow dr;
            StringBuilder sb = new StringBuilder();
            using (FileStream stream = new FileStream(@FileName, FileMode.Open, FileAccess.Read))
            {
                HSSFWorkbook workbook = new HSSFWorkbook(stream);//整个Excel文件
                HSSFSheet sheet = workbook.GetSheetAt(0);//得到里面第一个sheet
                int j;
                for (j = 0; j < ColumnDataType.Length; j++)
                    dt.Columns.Add("c" + j, Type.GetType("System.String"));
                for (int i = startRow - 1; i <= sheet.LastRowNum; i++)
                {
                    HSSFRow row = sheet.GetRow(i);//得到第i行
                    try
                    {
                        dr = dt.NewRow();
                        for (j = 0; j < ColumnDataType.Length; j++)
                            dr["c" + j] = GetCellData(ColumnDataType[j], row, j).ToString();
                        dt.Rows.Add(dr);
                        intime++;
                    }
                    catch (Exception er)
                    {
                        ertime++;
                        sb.Append(string.Format("第{0}行出错:{1}
", i + 1, er.Message));
                        continue;
                    }
                }
                ds.Tables.Add(dt);
            }
            if (ds.Tables[0].Rows.Count == 0 && sb.ToString() != "") throw new Exception(sb.ToString());
            return ds;
        } 
        #endregion
        #region 从DataSet导出到MemoryStream流
        /// <summary>
        /// 从DataSet导出到MemoryStream流
        /// </summary>
        /// <param name="SheetName">Excel文件中的Sheet名称</param>
        /// <param name="ds">存储数据的DataSet</param>
        /// <param name="HeaderNames">DataSet中的表头(数组形式)</param>
        /// <param name="columnNames">DataSet中的列名集合(数组形式)</param>
        /// <param name="datatypes">DataSet中的列名对应的数据类型(datatype枚举类)集合(数组形式)</param>
        public static MemoryStream CreateExcel(string SheetName, DataSet ds, string[] columnNames, string[] HeaderNames, datatype[] datatypes)
        {
            try
            {
                HSSFWorkbook wb = new HSSFWorkbook();
                HSSFSheet sheet = wb.CreateSheet(SheetName);
                HSSFRow row;
                HSSFCell cell;
                DataRow dr;
                int j;
                string column;
                object columnValue;
                #region 创建表头
                row = sheet.CreateRow(0);//创建第i行
                for (j = 0; j < columnNames.Length; j++)
                {
                    column = columnNames[j];
                    columnValue = HeaderNames[j];
                    try
                    {
                        cell = row.CreateCell(j);//创建第0行的第j列
                        try
                        {
                            cell.SetCellType(HSSFCell.CELL_TYPE_STRING);
                            cell.SetCellValue(columnValue.ToString());
                        }
                        catch { }
                    }
                    catch
                    {
                        continue;
                    }
                } 
                #endregion
                #region 创建每一行
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    dr = ds.Tables[0].Rows[i];
                    row = sheet.CreateRow(i + 1);//创建第i行
                    for (j = 0; j < columnNames.Length; j++)
                    {
                        column = columnNames[j];
                        columnValue = dr[column];
                        try
                        {
                            cell = row.CreateCell(j);//创建第i行的第j列
                        &

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

Copyright 2024-2027 pukuimin Rights Reserved.
粤ICP备17100155号