C# Npoi 实现Excel与数据库相互导入

简介: 十年河东,十年河西,莫欺少年穷!NPOI支持对 Word 和 Excel 文件的操作!针对 Word 的操作一般用于打印技术!说白了就是利用 Word 文件作为模板,生成各种不同的打印!具体用到的技术是:Word 关键字替换操作,Word 图片插入操作, Word 表格填充操作,Word 图表生...

十年河东,十年河西,莫欺少年穷!

NPOI支持对 Word 和 Excel 文件的操作!

针对 Word 的操作一般用于打印技术!说白了就是利用 Word 文件作为模板,生成各种不同的打印!具体用到的技术是:Word 关键字替换操作,Word 图片插入操作, Word 表格填充操作,Word 图表生成操作等等,在此就不一一介绍了,有兴趣的小虎斑可以参考鄙人博客:专业 web 打印组件 及 C# web项目利用docx文档作为模板~为打印专做的解决方案

针对 Excel 文件的操作一般常用的就两种:

1、将数据库数据导入至Excel

2、将 Excel 中数据导入至数据库

当然,针对Excel文件的操作也有其他优秀的组件实现,譬如:Spire.XLS,关于这个组件的运用,大家可参考我的博客:Spire.XLS,生成Excel文件、加载Excel文件

好了,说了这么多,咱们进入正题:

其实说到正题,也没什么可说的,都是一些代码,会调用就行了。

源代码如下:

using NPOI.HSSF.UserModel;
using NPOI.SS.Formula.Eval;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace KMHC.Infrastructure.Excel
{
    public class ExcelHelper
    {
        #region DataTable导出至Excel
        /// 
        /// 导出至Excel
        /// 
        /// 
数据源 /// Xls文件名 仅支持Xls扩展名 /// public static string LoadForToExcel(DataTable dt, string templateName) { string mapPath = HttpContext.Current.Server.MapPath(VirtualPathUtility.GetDirectory( " ~ " )); string path = string.Format( @" {0}Templates\{1}.xls " , mapPath, templateName); GridToExcelByNPOI(dt, path); return path; } /// /// 导出至Excel具体实现 /// /// 数据源 /// 文件路径 private static void GridToExcelByNPOI(DataTable dt, string strExcelFileName ) { HSSFWorkbook workbook = new HSSFWorkbook(); try { ISheet sheet = workbook.CreateSheet( " Sheet1 " ); ICellStyle HeadercellStyle = workbook.CreateCellStyle(); HeadercellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; HeadercellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; HeadercellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; HeadercellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; HeadercellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; // 字体 NPOI.SS.UserModel.IFont headerfont = workbook.CreateFont(); headerfont.Boldweight = ( short )FontBoldWeight.Bold; HeadercellStyle.SetFont(headerfont); // 用column name 作为列名 int icolIndex = 0 ; IRow headerRow = sheet.CreateRow( 0 ); foreach (DataColumn item in dt.Columns) { ICell cell = headerRow.CreateCell(icolIndex); cell.SetCellValue(item.ColumnName); cell.CellStyle = HeadercellStyle; icolIndex++ ; } ICellStyle cellStyle = workbook.CreateCellStyle(); // 为避免日期格式被Excel自动替换,所以设定 format 为 『@』 表示一率当成text來看 cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat( " @ " ); cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; NPOI.SS.UserModel.IFont cellfont = workbook.CreateFont(); cellfont.Boldweight = ( short )FontBoldWeight.Normal; cellStyle.SetFont(cellfont); // 建立内容行 int iRowIndex = 1 ; int iCellIndex = 0 ; foreach (DataRow Rowitem in dt.Rows) { IRow DataRow = sheet.CreateRow(iRowIndex); foreach (DataColumn Colitem in dt.Columns) { ICell cell = DataRow.CreateCell(iCellIndex); cell.SetCellValue(Rowitem[Colitem].ToString()); cell.CellStyle = cellStyle; iCellIndex++ ; } iCellIndex = 0 ; iRowIndex++ ; } // 自适应列宽度 for ( int i = 0; i < icolIndex; i++ ) { sheet.AutoSizeColumn(i); } // 写Excel FileStream file = new FileStream(strExcelFileName, FileMode.OpenOrCreate); workbook.Write(file); // 将Excel文件保存到项目中 file.Flush(); file.Close(); // Log.WriteLog("导出Excel成功!"); } catch (Exception ex) { // Log.WriteLog("导出Excel异常:", ex); } finally { workbook = null ; } } #endregion #region Excel文件数据导出至DataTable /// /// Excel数据导出至DataTable /// /// 文件名 /// /// 第几个Sheet的数据 public static DataTable LoadForToDataTable( string templateName, string strTableName, int iSheetIndex) { string mapPath = HttpContext.Current.Server.MapPath(VirtualPathUtility.GetDirectory( " ~ ")); // 获取项目根目录 string path = string.Format( @" {0}Templates\{1}.xls ", mapPath, templateName); // Templates 构造根目录路径 Templates 是项目的一个文件夹 return XlSToDataTable(path, strTableName, iSheetIndex); } /// /// Excel文件导成Datatable /// /// Excel文件目录地址 /// Datatable表名 /// Excel sheet index /// private static DataTable XlSToDataTable( string strFilePath, string strTableName, int iSheetIndex) { string strExtName = Path.GetExtension(strFilePath); DataTable dt = new DataTable(); if (! string .IsNullOrEmpty(strTableName)) { dt.TableName = strTableName; } if (strExtName.Equals( " .xls ") || strExtName.Equals( " .xlsx " )) { using (FileStream file = new FileStream(strFilePath, FileMode.Open, FileAccess.Read)) { HSSFWorkbook workbook = new HSSFWorkbook(file); ISheet sheet = workbook.GetSheetAt(iSheetIndex); // 列头 foreach (ICell item in sheet.GetRow(sheet.FirstRowNum).Cells) { dt.Columns.Add(item.ToString(), typeof( string )); } // 写入内容 System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); while (rows.MoveNext()) { IRow row = (HSSFRow)rows.Current; if (row.RowNum == sheet.FirstRowNum) { continue ; } DataRow dr = dt.NewRow(); foreach (ICell item in row.Cells) { switch (item.CellType) { case CellType.Boolean: dr[item.ColumnIndex] = item.BooleanCellValue; break ; case CellType.Error: dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue); break ; case CellType.Formula: switch (item.CachedFormulaResultType) { case CellType.Boolean: dr[item.ColumnIndex] = item.BooleanCellValue; break ; case CellType.Error: dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue); break ; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(item)) { dr[item.ColumnIndex] = item.DateCellValue.ToString( " yyyy-MM-dd hh:MM:ss " ); } else { dr[item.ColumnIndex] = item.NumericCellValue; } break ; case CellType.String: string str = item.StringCellValue; if (! string .IsNullOrEmpty(str)) { dr[item.ColumnIndex] = str.ToString(); } else { dr[item.ColumnIndex] = null ; } break ; case CellType.Unknown: case CellType.Blank: default : dr[item.ColumnIndex] = string .Empty; break ; } break ; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(item)) { dr[item.ColumnIndex] = item.DateCellValue.ToString( " yyyy-MM-dd hh:MM:ss " ); } else { dr[item.ColumnIndex] = item.NumericCellValue; } break ; case CellType.String: string strValue = item.StringCellValue; if (! string .IsNullOrEmpty(strValue)) { dr[item.ColumnIndex] = strValue.ToString(); } else { dr[item.ColumnIndex] = null ; } break ; case CellType.Unknown: case CellType.Blank: default : dr[item.ColumnIndex] = string .Empty; break ; } } dt.Rows.Add(dr); } } } return dt; } #endregion } } View Code

具体调用如下:

 public string Export()
        {
   ////自己构造泛型:AllList
            //打印开始 自己构造泛型:AllList
            DataTable dt = new DataTable();
            dt.Columns.Add("所属", typeof(string));
            dt.Columns.Add("消费日期", typeof(string));
            dt.Columns.Add("消费项", typeof(string));
            dt.Columns.Add("类别", typeof(string));
            dt.Columns.Add("会员卡", typeof(string));
            dt.Columns.Add("现金", typeof(string));
            dt.Columns.Add("支付宝", typeof(string));
            dt.Columns.Add("微信", typeof(string));
            dt.Columns.Add("一卡通", typeof(string));
            foreach (var item in AllList)
            {
                DataRow dr = dt.NewRow();
                dr["所属"] = "";
                if (item.ServiceType.HasValue)
                {
                    var dicModelForService = dicListForService.FirstOrDefault(A => A.ItemCode == item.ServiceType.ToString());
                    if (dicModelForService != null)
                    {
                        dr["所属"] = dicModelForService.ItemName;
                    }
                }
                try
                {
                    dr["消费日期"] = item.FeeDate.ToString("yyyy-MM-dd");
                }
                catch
                {
                    dr["消费日期"] = "";
                }
                dr["消费项"] = item.FeeName;
                dr["类别"] = "";
                if (item.FeeType.HasValue)
                {
                    var dicModel = dicList.FirstOrDefault(A => A.ItemCode == item.FeeType.ToString());
                    if (dicModel != null)
                    {
                        dr["类别"] = dicModel.ItemName;
                    }
                }
                //
                dr["会员卡"] = item.ResidentCard.HasValue ? Convert.ToDouble(-item.ResidentCard).ToString("0.00") : "";
                dr["现金"] = item.Cash.HasValue ? Convert.ToDouble(-item.Cash).ToString("0.00") : "";
                dr["支付宝"] = item.Alipay.HasValue ? Convert.ToDouble(-item.Alipay).ToString("0.00") : "";
                dr["微信"] = item.WeChatpay.HasValue ? Convert.ToDouble(-item.WeChatpay).ToString("0.00") : "";
                dr["一卡通"] = item.AllPurposeCard.HasValue ? Convert.ToDouble(-item.AllPurposeCard).ToString("0.00") : "";
                dt.Rows.Add(dr);
            }

            return ExcelHelper.LoadForToExcel(dt, "FeeDetails");
        }

前端Action视图代码如下:

   public ActionResult Export()
        {
            IReportManageService service = IOCContainer.Instance.Resolve();
            string pth = service.Export();
            System.Web.HttpContext.Current.Response.Charset = "GB2312";
            System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;  
            Response.AddHeader("Content-type", "application/ms-excel");
            Response.AddHeader("Accept-Ranges", "bytes");
            Response.AddHeader("Content-Length", new System.IO.FileInfo(pth).Length.ToString());
            Response.AddHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMddhhssmm") + ".xls");
            Response.WriteFile(pth);
            Response.End();
            return View();
        }

以上便是所有源代码,希望大家喜欢!

截图如下:

@陈卧龙的博客

相关文章
|
3月前
|
SQL 关系型数据库 MySQL
数据库导入SQL文件:全面解析与操作指南
在数据库管理中,将SQL文件导入数据库是一个常见且重要的操作。无论是迁移数据、恢复备份,还是测试和开发环境搭建,掌握如何正确导入SQL文件都至关重要。本文将详细介绍数据库导入SQL文件的全过程,包括准备工作、操作步骤以及常见问题解决方案,旨在为数据库管理员和开发者提供全面的操作指南。一、准备工作在导
557 0
|
2天前
|
关系型数据库 MySQL Linux
Linux下mysql数据库的导入与导出以及查看端口
本文详细介绍了在Linux下如何导入和导出MySQL数据库,以及查看MySQL运行端口的方法。通过这些操作,用户可以轻松进行数据库的备份与恢复,以及确认MySQL服务的运行状态和端口。掌握这些技能,对于日常数据库管理和维护非常重要。
28 8
|
4天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
26天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
2月前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
4月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
3月前
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
397 1
|
3月前
|
SQL 缓存 大数据
C#高效处理大数据的批次处理,以及最好的数据库设计
C#高效处理大数据的批次处理,以及最好的数据库设计
97 0
|
4月前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
368 6