Npoi导入导出Execl

读取csv格式时内容含有逗号的无法处理

using System;
using System.Data;
using System.IO;
using System.Web;
using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
using NPOI.POIFS;
using NPOI.Util;
using System.Text;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

namespace ProductBLL.download
{
    public class ExcelHelper
    {

        #region NPOI读取导入的文件,将xlsx,xls文件的数据读取到DataTable中

        /// <summary>
        /// 将excel中的数据导入到DataTable中
        /// </summary>
        /// <param name="sheetName">文件路径</param>
        ///<param name="fileExtension">后缀名</param>
        /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
        /// <returns>返回的DataTable</returns>
        public static DataTable ExcelToDataTable(string fileName, string fileExtension, bool isFirstRowColumn)
        {
            IWorkbook workbook = null;
            FileStream fs = null;
            ISheet sheet = null;
            DataTable data = new DataTable();
            int startRow = 0;
            try
            {
                //把文件内容导入到工作薄当中,然后关闭文件
                using (fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                {
                    //根据不同版本获取第一个工作表的数据
                    if (fileExtension == ".xls") // 2003版本
                    {
                        workbook = new HSSFWorkbook(fs);
                        // sheet = workbook.GetSheet("SheetName"); 可以根据Sheet工作表的名字来获取
                        sheet = workbook.GetSheetAt(0) as HSSFSheet;
                    }

                    else if (fileExtension == ".xlsx") // 2007版本
                    {
                        workbook = new XSSFWorkbook(fs);
                        sheet = workbook.GetSheetAt(0) as XSSFSheet;
                    }
                }

                if (sheet != null)
                {
                    IRow firstRow = sheet.GetRow(0);
                    int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数

                    #region 第一行是否是作为列名
                    if (isFirstRowColumn)
                    {
                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                        {
                            ICell cell = firstRow.GetCell(i);
                            if (cell != null)
                            {
                                string cellValue = cell.StringCellValue;
                                if (cellValue != null)
                                {
                                    DataColumn column = new DataColumn(cellValue);
                                    data.Columns.Add(column);
                                }
                            }
                        }
                        startRow = sheet.FirstRowNum + 1;
                    }
                    else
                    {
                        startRow = sheet.FirstRowNum;
                    }
                    #endregion

                    //最后一行的标号
                    int rowCount = sheet.LastRowNum;
                    #region 从第一行开始遍历数据保存到DataRow

                    for (int i = startRow; i <= rowCount; ++i)
                    {
                        IRow row = sheet.GetRow(i);
                        if (row == null) continue; //没有数据的行默认是null       

                        DataRow dataRow = data.NewRow();
                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                        {
                            if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
                                dataRow[j] = row.GetCell(j).ToString();
                        }
                        data.Rows.Add(dataRow);
                    }
                    #endregion
                }

                return data;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                return null;
            }
        }

        #endregion

        #region 读取导入的文件,将CSV文件的数据读取到DataTable中
        /// <summary>
        /// 将CSV文件的数据读取到DataTable中
        /// </summary>
        /// <param name="">文件地址</param>
        /// <returns>返回读取了CSV数据的DataTable</returns>
        public static DataTable OpenCSV(string fileName)
        {

            DataTable dt = new DataTable();
            FileStream fs = new FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
            try
            {
                //记录每次读取的一行记录
                string strLine = "";
                //记录每行记录中的各字段内容
                string[] aryLine;
                //标示列数
                int columnCount = 0;
                //标示是否是读取的第一行
                bool IsFirst = true;

                //逐行读取CSV中的数据  注意要确保文本中没有逗号
                while ((strLine = sr.ReadLine()) != null)
                {
                    aryLine = strLine.Split(‘,‘); //把读取到的内容分割
                    if (IsFirst == true)
                    {
                        IsFirst = false;
                        columnCount = aryLine.Length;
                        //创建列
                        for (int i = 0; i < columnCount; i++)
                        {
                            DataColumn dc = new DataColumn(aryLine[i]);
                            dt.Columns.Add(dc);
                        }
                    }
                    else
                    {
                        DataRow dr = dt.NewRow(); //创建行
                        for (int j = 0; j < columnCount; j++)
                        {
                            dr[j] = aryLine[j];
                        }
                        dt.Rows.Add(dr);
                    }
                }

                sr.Close();
                fs.Close();

            }
            catch (Exception ex)
            {
                //  Mes += "文件导入失败,请检查数据格式!" + ex.ToString() + "/r/n";
            }

            finally
            {
                sr.Close();
                fs.Close();
            }

            return dt;
        }
        #endregion

        #region DataTable导出Execl
        public static MemoryStream TableToExcel(DataTable dt, string WorkbookType)
        {
            IWorkbook workbook = null;
            if (WorkbookType.ToLower() == "xls")
                workbook = new HSSFWorkbook();
            else
                workbook = new XSSFWorkbook();//xlxs
            ISheet sheet = workbook.CreateSheet("Sheet1");
            //表头
            IRow row = sheet.CreateRow(0);
            ICell cell = row.CreateCell(0);

            for (int i = 0; i < dt.Columns.Count; i++)
            {
                cell = row.CreateCell(i);
                cell.SetCellValue(dt.Columns[i].ColumnName);
            }
            //数据
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow row1 = sheet.CreateRow(i + 1);
                cell = row1.CreateCell(0);
                //cell.SetCellValue(dt.Rows[i][0].ToString());
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    cell = row1.CreateCell(j);
                    cell.SetCellValue(dt.Rows[i][j].ToString());
                }
            }
            MemoryStream stream = new MemoryStream();
            workbook.Write(stream);//生成内存流
            return stream;
        }
        #endregion

        #region DataTable生成csv
        public static bool TableToCsv(DataTable dt, string path)
        {

            bool isresult= false;
            System.IO.FileStream fs = new FileStream(path, System.IO.FileMode.Create, System.IO.FileAccess.Write);
            StreamWriter sw = new StreamWriter(fs, new System.Text.UnicodeEncoding());;
            //Tabel header
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                sw.Write(dt.Columns[i].ColumnName);
                sw.Write("\t");
            }
            sw.WriteLine("");
            //Table body
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    sw.Write(DelQuota(dt.Rows[i][j].ToString()));
                    sw.Write("\t");
                }
                sw.WriteLine("");
            }
            sw.Flush();
            sw.Close();
            if (File.Exists(path))
            {
                isresult = true;
            }
            return isresult;

        }
        public static string DelQuota(string str)
        {
            string result = str;
            string[] strQuota = { "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "`", ";", "‘", ",", ".", "/", ":", "/,", "<", ">", "?" };
            for (int i = 0; i < strQuota.Length; i++)
            {
                if (result.IndexOf(strQuota[i]) > -1)
                    result = result.Replace(strQuota[i], "");
            }
            return result;
        }
        #endregion

    }
}

ExcelHelper

protected void downloadfile(DataTable dd, string s_path)
        {

                #region 下载服务器上生成的execl文件
                System.IO.FileInfo file = new System.IO.FileInfo(s_path);
                HttpContext.Current.Response.ContentType = "application/ms-download";
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.AddHeader("Content-Type", "application/octet-stream");
                HttpContext.Current.Response.Charset = "utf-8";
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8));
                HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
                HttpContext.Current.Response.WriteFile(file.FullName);
                HttpContext.Current.Response.Flush();
                HttpContext.Current.Response.Clear();
                //下载完成后删除服务器下生成的文件
                if (File.Exists(s_path))
                {
                    File.Delete(s_path);

                }
                HttpContext.Current.Response.End(); ;
                #endregion

            #region   将二进制字符串数组写入输出流

            HttpContext.Current.Response.ContentType = "application/ms-download";
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.AddHeader("Content-Type", "application/octet-stream");
            HttpContext.Current.Response.Charset = "utf-8";

            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode("222.xls", Encoding.UTF8));//222.xls下载是默认文件名

            HttpContext.Current.Response.BinaryWrite(ProductBLL.download.ExcelHelper.TableToExcel(dd,"xls").GetBuffer());
            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.Clear();

            HttpContext.Current.Response.End();
            #endregion

web下载

时间: 2024-11-06 11:26:02

Npoi导入导出Execl的相关文章

使用NPOI导入导出Execl

.Net中对Execl实际操作中,如果如果直接调用微软的Office组件,会碰到各种问题,为了避免这些问题发生,使用NPOI控件.这是款非常不错的第三方插件. 在项目中需要引用NPOI.dll文件,这个文件在网上下载一个就可以了. NPOI教程链接:http://www.npoi.info/tutorial 下面是对DataGridView的导入和导出 导出 /// <summary> /// 订单导出 /// </summary> /// <param name="

NPOI导入导出数据

//导入数据 protected void btnImport_Click(object sender, EventArgs e) { //判断fileImport控件中是否有需要上传的文件 if (this.fileImport.HasFile) { //判断文件类型是否符合要求   if (Path.GetExtension(this.fileImport.FileName) != ".xls") { MessageTips("上传的文件类型不符合要求", Me

NPOI导入导出Excel

.net mvc利用NPOI导入导出excel 1.导出Excel :首先引用NPOI包,从这里下载>download(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> /// <returns></returns> public FileResult ExportStu2() { //获取list数据 var checkList = (from oc in db.Or

Asp.net中利用NPOI组件快速导入导出Execl数据

相信很多童鞋都开发过Execl的导入导出功能,最近产品中无论是后台数据分析的需要,还是前端满足用户管理的方便,都有Execl导入导出的维护需求产生. 以前做这个功能,如果是web,利用HttpContext.Current.Response.ContentType ="application/ms-excel";就可以导出html数据表格到execl中,这种方法的问题就是编码格式的兼容性太差,用Mac OS之类的 office打开直接乱码给你看.或者是调用office的COM组件,或宏

使用NPOI导入导出标准Excel

尝试过很多Excel导入导出方法,都不太理想,无意中逛到oschina时,发现了NPOI,无需Office COM组件且不依赖Office,顿时惊为天人,怀着无比激动的心情写下此文. 曾使用过的方法 直接导出html,修改后缀名为.xls,这个方法有点像骗人的把戏,而且不能再导入 使用Jet OLEDB引擎来进行导入导出,完全使用sql语句来进行操作,缺点能控制的东西非常有限,比如格式就难以控制 使用Office COM组件进行导入导出,对环境依赖性太强(如"检索 COM 类工厂-"错

c#.net 使用NPOI导入导出标准Excel (asp.net winform csharp)

尝试过很多Excel导入导出方法,都不太理想,无意中逛到oschina时,发现了NPOI,无需Office COM组件且不依赖Office,顿时惊为天人,怀着无比激动的心情写下此文. 曾使用过的方法 直接导出html,修改后缀名为.xls,这个方法有点像骗人的把戏,而且不能再导入 使用Jet OLEDB引擎来进行导入导出,完全使用sql语句来进行操作,缺点能控制的东西非常有限,比如格式就难以控制 使用Office COM组件进行导入导出,对环境依赖性太强(如“检索 COM 类工厂…”错误):且需

npoi导入导出excel (泛型)

最近新项目开始了,万能的excel又要上台工作.对于导出代码网上的确很多,合适的没有找到. 我们这边使用的ef + dapper 两套orm框架,他们有一个共同点,都是操作实体对象的.所以导出不能用万能的DataTable了.后面花了一些时间,集合众仙所长,写了一套单excel导入导出的方式.数据源为List<T> public class Excel { /// <summary> /// 导出到sheet中 /// </summary> /// <typepa

NET中使用开源组件NPOI快速导入导出Execl数据

www.qdmm.com/BookReader/110148,68377193.aspxwww.qdmm.com/BookReader/110148,68377198.aspxwww.qdmm.com/BookReader/110148,68377203.aspxwww.qdmm.com/BookReader/110148,68377209.aspxwww.qdmm.com/BookReader/110148,68377213.aspxwww.qdmm.com/BookReader/110148

.net mvc利用NPOI导入导出excel

1.导出Excel : 首先引用NPOI包,从这里下载>download (Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> /// <returns></returns> public FileResult ExportStu2() { //获取list数据 var checkList = (from oc in db.OrganizeCustoms join o i