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

简介: .net操作Excel的支持库下载   http://115.com/file/c2hkh144#NOPI.zip 以前用过依赖于office的方法对Excel文件进行操作,在自己机器上运行正常,到服务器上就不能运行。

.net操作Excel的支持库下载   http://115.com/file/c2hkh144#NOPI.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}\r\n", 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列
                            #region 插入第j列的数据
                            try
                            {
                                switch (datatypes[j])
                                {
                                    case datatype.String:
                                        {
                                            cell.SetCellType(HSSFCell.CELL_TYPE_STRING);
                                            cell.SetCellValue(columnValue.ToString());
                                        } break;
                                    case datatype.Datetime:
                                        {
                                            cell.SetCellType(HSSFCell.CELL_TYPE_STRING);
                                            cell.SetCellValue(Convert.ToDateTime(columnValue));
                                        } break;
                                    case datatype.Double:
                                        {
                                            cell.SetCellType(HSSFCell.CELL_TYPE_NUMERIC);
                                            cell.SetCellValue(Convert.ToDouble(columnValue));
                                        } break;
                                    case datatype.Bool:
                                        {
                                            cell.SetCellType(HSSFCell.CELL_TYPE_BOOLEAN);
                                            cell.SetCellValue(Convert.ToBoolean(columnValue));
                                        } break;
                                    case datatype.Richtext:
                                        {
                                            cell.SetCellType(HSSFCell.CELL_TYPE_FORMULA);
                                            cell.SetCellValue(columnValue.ToString());
                                        } break;
                                }
                            }
                            catch
                            {
                                cell.SetCellType(HSSFCell.CELL_TYPE_STRING);
                                cell.SetCellValue(columnValue.ToString());
                            }
                            #endregion

                        }
                        catch
                        {
                            continue;
                        }
                    }
                } 
                #endregion

                //using (FileStream fs = new FileStream(@SaveFileName, FileMode.OpenOrCreate))//生成文件在服务器上
                //{
                //    wb.Write(fs);
                //}
                using (MemoryStream ms = new MemoryStream())
                {
                    wb.Write(ms);
                    return ms;
                }
            }
            catch (Exception er)
            {
                throw er;
            }
        } 
        #endregion

        #region 得到不同数据类型单元格的数据
        /// <summary>
        /// 得到不同数据类型单元格的数据
        /// </summary>
        /// <param name="datatype">数据类型</param>
        /// <param name="row">数据中的一行</param>
        /// <param name="column">哪列</param>
        /// <returns></returns>
        public static object GetCellData(datatype datatype, HSSFRow row, int column)
        {

            switch (datatype)
            {
                case datatype.String:
                    try { return row.GetCell(column).StringCellValue; }
                    catch { return row.GetCell(column).NumericCellValue; }
                case datatype.Bool:
                    try { return row.GetCell(column).BooleanCellValue; }
                    catch { return row.GetCell(column).StringCellValue; }
                case datatype.Datetime:
                    try { return row.GetCell(column).DateCellValue; }
                    catch { return row.GetCell(column).StringCellValue; }
                case datatype.Double:
                    try { return row.GetCell(column).NumericCellValue; }
                    catch { return row.GetCell(column).StringCellValue; }
                case datatype.Richtext:
                    try { return row.GetCell(column).RichStringCellValue; }
                    catch { return row.GetCell(column).StringCellValue; }
                default: return "";
            }
        } 
        #endregion

        #region 枚举(单元格数据类型)
        /// <summary>
        /// 枚举(单元格数据类型)
        /// </summary>
        public enum datatype
        {
            /// <summary>
            /// String=1
            /// </summary>
            String = 1, 
            /// <summary>
            /// Bool=2
            /// </summary>
            Bool=2, 
            /// <summary>
            /// Datetime=3
            /// </summary>
            Datetime=3,
            /// <summary>
            /// Double=4
            /// </summary>
            Double=4, 
            /// <summary>
            /// Richtext=5
            /// </summary>
            Richtext=5
        } 
        #endregion
    }
}


这样,就能操作Excel了,使用时只需要调用就行了。


友情提示:

使用时请注意:有些人分不清服务器对文件怎么操作的

在web应用程序里,客户端选择一个文件,就调用函数来转化为DataSet

这种情况,除非你直接在服务器的电脑上操作,否则操作不可能成功,服务器上没那个文件,你让他转化什么呢? 

这个文件,肯定得在服务器上存在,可以先从客户端上传,再确定上传后的服务器路径,mappath一下,转化为全路径才可以操作


一、上面的可以将Excel导入到DataSet,操作DataSet应该不是我要说的内容问题了。呵呵

二、那么将DataSet保存到Excel,应该还要一个方法转化一下。上面的方法,只是把Excel保存为 MemoryStream内存流,方便转化成其它数据流的。

写一个方法将MemoryStream转化为Excel文件

1、asp.net网页的解决方法,保存到服务器的内存流中,再弹出给客户端下载 。

#region (asp.net网页中)二进制byte[] 导出到文件(文件要有正确的后缀)
        /// <summary>
        /// (asp.net网页中)二进制byte[] 导出到文件(文件要有正确的后缀)
        /// </summary>
        /// <param name="pg">页面,传 this</param>
        /// <param name="bytes">文件的二进制数据</param>
        /// <param name="FileName">导出的文件名(Excel:.xls)</param>
        public static void BytesToFile(System.Web.UI.Page pg, byte[] bytes, string FileName)
        {
            pg.Response.Buffer = true;
            pg.Response.Clear();
            pg.Response.ContentType = "application/download";
            FileName = HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8);
            pg.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName + ";");
            pg.Response.BinaryWrite(bytes);
            pg.Response.Flush();
        }
        #endregion
BytesToFile(this.Page,MemoryStream1.ToArray(),"文件1.xls");
 

 

2、winform中的解决方法直接保存:

FileStream SaveFile = new FileStream("file1.xls", FileMode.Create, FileAccess.ReadWrite);
ms.WriteTo(SaveFile);


这样就保存到file1.xls中了。。



相关文章
|
23天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
106 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
1月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
40 6
按条件将Excel文件拆分到不同的工作表
|
1月前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
57 6
|
1月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
51 6
|
2月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
44 1
|
2月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
125 4
|
3月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
181 6
|
3月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
3月前
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
223 2
|
3月前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
294 0