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

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
/// <summary>
/// 导出至Excel
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="templateName">Xls文件名 仅支持Xls扩展名</param>
/// <returns></returns>
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;
}
/// <summary>
/// 导出至Excel具体实现
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="strExcelFileName">文件路径</param>
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 = ;
IRow headerRow = sheet.CreateRow();
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 = ;
int iCellIndex = ;
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 = ;
iRowIndex++;
} //自适应列宽度
for (int i = ; 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
/// <summary>
/// Excel数据导出至DataTable
/// </summary>
/// <param name="templateName">文件名</param>
/// <param name="strTableName"></param>
/// <param name="iSheetIndex">第几个Sheet的数据</param>
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);
}
/// <summary>
/// Excel文件导成Datatable
/// </summary>
/// <param name="strFilePath">Excel文件目录地址</param>
/// <param name="strTableName">Datatable表名</param>
/// <param name="iSheetIndex">Excel sheet index</param>
/// <returns></returns>
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
}
}

具体调用如下:

 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<IReportManageService>();
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();
}

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

截图如下:

@陈卧龙的博客

C# Npoi 实现Excel与数据库相互导入的更多相关文章

  1. C#NPOI对Excel的操作、导入导出时异常处理、最全的NPOI资料在这里~

    一.Excel理论知识 最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw  提取码:adnq • 整个Excel表格叫做工作 ...

  2. NPOI 2.1.1 系列(1) 使用NPOI读取 Excel文档 ;NpoiExcelHelper 导入导出 2003格式 2007格式的 Excel; Npoi 导出 xlsx 格式

    下载地址 http://npoi.codeplex.com/releases 下面放一个 NPOIHelper 助手类吧,也不是我写的- NpoiExcelHelper 可以生成xlsx格式publi ...

  3. winform做的excel与数据库的导入导出

    闲来无事,就来做一个常用的demo,也方便以后查阅 先看效果图 中间遇到的主要问题是获取当前连接下的所有的数据库以及数据库下所有的表 在网上查了查,找到如下的方法 首先是要先建立一个连接 _connM ...

  4. 如何使用NPOI 导出到excel和导入excel到数据库

    近期一直在做如何将数据库的数据导出到excel和导入excel到数据库. 首先进入官网进行下载NPOI插件(http://npoi.codeplex.com/). 我用的NPOI1.2.5稳定版. 使 ...

  5. NPOI把Excel导入到数据库

    二,把Excel中的数据导入到数据库的具体步骤: protected void Button1_Click(object sender, EventArgs e)        {           ...

  6. 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

    前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...

  7. 一步步实现ABAP后台导入EXCEL到数据库【3】

    在一步步实现ABAP后台导入EXCEL到数据库[2]里,我们已经实现计划后台作业将数据导入数据库的功能.但是,这只是针对一个简单的自定义结构的导入程序.在实践应用中,面对不同的表.不同的导入文件,我们 ...

  8. 一步步实现ABAP后台导入EXCEL到数据库【1】

    在SAP的应用当中,导入.导出EXCEL文件的情况是一个常见的需求,有时候用户需要将大量数据定期导入到SAP的数据库中.这种情况下,使用导入程序在前台导入可能要花费不少的时间,如果能安排导入程序为后台 ...

  9. NPOI、MyXls、Aspose.Cells 导入导出Excel(转)

    Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导s出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你 ...

随机推荐

  1. Activity的生命之路

    activity的生命周期这张图是最经典的了,下面我就说一下 这张图的脉络: 第一条线我们这么走 onCreate→onStart→onResume→onPause→onStop→onDestroy ...

  2. Linux内存使用情况以及内存泄露分析之工具与方法

    <Linux C/C++ Memory Leak Detection Tool> 1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=M ...

  3. LINUX PID 1和SYSTEMD 专题

    Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个 ...

  4. Unable to find remote helper for 'https'

    出现这个报错,说明git目前的状态是正常的,要么没装好,要么自己解决压缩安装导致没有权限 第三次情况是,使用yum install git 重新安装后,仍然报错,是因为环境变量中GIT_HOM配置的仍 ...

  5. tkiner中Radiobutton单选框控件(七)

    Radiobutton控件 由于本次内容中好多知识都是之前重复解释过的,本次就不做解释了.不太清楚的内容请参考tkinter1-6节中的内容 import tkinter wuya = tkinter ...

  6. 连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots

    今天在redis中执行setrange name 1 chun 命令时报了如下错误提示: (error) MISCONF Redis is configured to save RDB snapsho ...

  7. FTP连接池

    我们项目使用的是 Apache的(commons-net-3.2.jar) FTPClient,但是系统偶尔会有异常,趁着刚解决完,总结一下. 日志中提示是类似 java.lang.Exception ...

  8. bzoj1547 周末晚会

    我们要求方案数,还是旋转同构的,想burnside,如果我们能计算出转i位不变的满足条件的数量,那么这道题我们就解决了. 考虑转i位时,设tmp=gcd(i,n),那么就共有tmp个循环节. 当tmp ...

  9. POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置关系

    POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置 Description Calculate the number of toys th ...

  10. JAVA中正则表达式总结

    昨天,我的朋友请教我正则表达式.我也好久没有写过正则表达式了,昨天刚好看了下如鹏网创始人杨中科老师关于正则表达式的讲解.使我加深了正则表达式的印像.现我把他总结下: 许多语言,包括Perl.PHP.P ...