开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2061

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1015|回复: 70

[蓬莱仙羽] [Aladdin]NPOI读写Excel

[复制链接]  [移动端链接]
排名
732
昨日变化
3

33

主题

481

帖子

2620

积分

Rank: 9Rank: 9Rank: 9

UID
1261
好友
36
蛮牛币
1459
威望
0
注册时间
2013-7-31
在线时间
608 小时
最后登录
2018-1-19

专栏作家社区QQ达人认证开发者

发表于 2017-12-24 14:14:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 蓬莱仙羽 于 2017-12-24 14:19 编辑

最终效果图使用
结果

需求
从一个Excel数据源表格中,根据Type字段筛选出EMS的数据,并且一个公司做出一个发票收执。

发票收执模板

手动操作的话工作量非常大,工具操作的话就非常非常方便了。
NPOI简介
NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。
POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目,NPOI是对应的.net库。
优势(一)传统操作EXCEL遇到的问题
  • 如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。
  • Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。
  • 导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。
  • Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。
####(二)使用NPOI的优势
  • 您可以完全免费使用该框架
  • 包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)
  • 专业的技术支持服务
  • 支持处理的文件格式包括xls, xlsx, docx.
  • 采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间)
  • 同时支持文件的导入和导出
  • 基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0)
  • 来自全世界大量成功且真实的测试Cases
  • 大量的实例代码
  • 你不需要在服务器上安装微软的Office,可以避免版权问题。
  • 使用起来比Office PIA的API更加方便,更人性化。
  • 你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。
  • 不仅仅对与Excel可以进行操作,对于doc、ppt文件也可以做对应的操作
NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入。
C#操作NPOI获得目录
[AppleScript] 纯文本查看 复制代码
DirectoryInfo dirInfo = new DirectoryInfo(args[0]);

深度递归遍历获得EXCEL文件

[AppleScript] 纯文本查看 复制代码
static void GetExcels(DirectoryInfo folder)
{
    try
    {
        var folders = folder.GetDirectories();
        for (int i = 0; i < folders.Length; i++)
        {
            GetExcels(folders[i]);
        }

        var excelFiles = folder.GetFiles("*.xlsx");
        for (int i = 0; i < excelFiles.Length; i++)
        {
            string fileName = folder.FullName + "\\" + excelFiles[i].Name;
            ReadOneExcel(fileName);
        }
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}



读取EXCEL
[AppleScript] 纯文本查看 复制代码
static void ReadOneExcel(string fileName)
{
    using (fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        workBook = new XSSFWorkbook(fs);
        XSSFSheet sheet = (XSSFSheet)workBook.GetSheetAt(0);
		for (int i = 0; i < sheet.LastRowNum; i++)
        {
            VATModel model = new VATModel();
            XSSFRow row = (XSSFRow)sheet.GetRow(i);
            XSSFCell cell = (XSSFCell)row.GetCell(4);
         }
    }
}



写入EXCEL
[AppleScript] 纯文本查看 复制代码
public static void WriteToExcel(string filePath, string name, List<VATModel> data)
{
    //创建工作薄  
    IWorkbook wb;
    string extension = System.IO.Path.GetExtension(filePath);
    //根据指定的文件格式创建对应的类
    if (extension.Equals(".xls"))
    {
        wb = new HSSFWorkbook();
    }
    else
    {
        wb = new XSSFWorkbook();
    }
    //居中加粗
    ICellStyle titleStyle = wb.CreateCellStyle();
    titleStyle.Alignment = HorizontalAlignment.Center;
    titleStyle.VerticalAlignment = VerticalAlignment.Center;
    IFont font1 = wb.CreateFont();//字体
    font1.FontName = "宋体";
    font1.FontHeightInPoints = (short)16;
    font1.Boldweight = (short)FontBoldWeight.Bold;//字体加粗样式
    titleStyle.SetFont(font1);
	//创建一个表单
    ISheet sheet = wb.CreateSheet("Sheet0");
    for (int i = 0; i < 8 + names.Count; i++)
	{
        row = sheet.CreateRow(i);
        for (int j = 0; j < columnCount; j++)
        {
            cell = row.CreateCell(j);
         }
         sheet.AutoSizeColumn(j);
     }
}



设置CELL格式
[AppleScript] 纯文本查看 复制代码
 //宋体11 加粗 居中  右上方边框加粗
 ICellStyle normalStyle02 = wb.CreateCellStyle();
 normalStyle02.VerticalAlignment = VerticalAlignment.Center;
 normalStyle02.Alignment = HorizontalAlignment.Center;
 normalStyle02.SetFont(font7);
 normalStyle02.BorderBottom = BorderStyle.Thin;
 normalStyle02.BorderLeft = BorderStyle.Thin;
 normalStyle02.BorderRight = BorderStyle.Thick;
 normalStyle02.BorderTop = BorderStyle.Thick;
 
 cell.CellStyle = normalStyle02;



写入CELL数据
[AppleScript] 纯文本查看 复制代码
static void SetCellValue(ICell cell, object obj)
{
    if (obj.GetType() == typeof(int))
    {
        cell.SetCellValue((int)obj);
    }
    else if (obj.GetType() == typeof(double))
    {
        cell.SetCellValue((double)obj);
    }
    else if (obj.GetType() == typeof(IRichTextString))
    {
        cell.SetCellValue((IRichTextString)obj);
    }
    else if (obj.GetType() == typeof(string))
    {
        cell.SetCellValue(obj.ToString());
    }
    else if (obj.GetType() == typeof(DateTime))
    {
        cell.SetCellValue((DateTime)obj);
    }
    else if (obj.GetType() == typeof(bool))
    {
        cell.SetCellValue((bool)obj);
    }
    else
    {
        cell.SetCellValue(obj.ToString());
    }
}


合并CELL
[AppleScript] 纯文本查看 复制代码
CellRangeAddress region = new CellRangeAddress(0, 0, 0, 5);
sheet.AddMergedRegion(region);



写入文件
[AppleScript] 纯文本查看 复制代码
try
{
    FileStream fs = File.OpenWrite(filePath);
    wb.Write(fs);//向打开的这个Excel文件中写入表单并保存。  
    fs.Close();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.Read();
}



批处理
[AppleScript] 纯文本查看 复制代码
@echo off
Set BatDir=%~dp0
set/p path=请输入你的Excel原目录路径:
set/p pathoutput=请输入你导出后的excel路径:
set/p data=请输入导出表格的Data(例如:2017-12-20)

Set ToolPath=%BatDir%\Tool\VATReader.exe
call %ToolPath% %path% %pathoutput% %data%



原文
游客,如果您要查看本帖隐藏内容请回复



回复

使用道具 举报

6蛮牛粉丝
1381/1500
排名
1002
昨日变化
4

0

主题

198

帖子

1381

积分

Rank: 6Rank: 6Rank: 6

UID
37063
好友
1
蛮牛币
4164
威望
0
注册时间
2014-7-30
在线时间
271 小时
最后登录
2018-1-19
发表于 2017-12-25 10:05:34 | 显示全部楼层
赞一下, 以备后用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

回复

使用道具 举报

3偶尔光临
272/300
排名
6671
昨日变化
4

0

主题

31

帖子

272

积分

Rank: 3Rank: 3Rank: 3

UID
229079
好友
0
蛮牛币
238
威望
0
注册时间
2017-6-27
在线时间
85 小时
最后登录
2018-1-16
发表于 2017-12-25 10:16:45 | 显示全部楼层
谢谢分享
[发帖际遇]: dqs123flying 被钱袋砸中进医院,看病花了 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
693/1000
排名
3283
昨日变化

5

主题

152

帖子

693

积分

Rank: 5Rank: 5

UID
14200
好友
1
蛮牛币
1046
威望
0
注册时间
2014-2-12
在线时间
169 小时
最后登录
2018-1-7
发表于 2017-12-25 10:26:46 | 显示全部楼层
Mark一下

回复

使用道具 举报

排名
221
昨日变化
1

5

主题

608

帖子

3486

积分

Rank: 11Rank: 11Rank: 11Rank: 11Rank: 11

UID
31708
好友
5
蛮牛币
7391
威望
0
注册时间
2014-6-28
在线时间
1051 小时
最后登录
2018-1-20

活力之星

QQ
发表于 2017-12-25 10:51:21 | 显示全部楼层
RE: [Aladdin]NPOI读写Excel [修改]
高级模式

回复 支持 反对

使用道具 举报

2初来乍到
148/150
排名
10474
昨日变化
128

0

主题

19

帖子

148

积分

Rank: 2Rank: 2

UID
257803
好友
0
蛮牛币
571
威望
0
注册时间
2017-12-4
在线时间
51 小时
最后登录
2018-1-19
发表于 2017-12-25 11:23:12 | 显示全部楼层
顶一波,虽然看不懂,不过我找到了一个unity导入导出excel的插件,里面封装的也是NPOI,很方便!

回复 支持 反对

使用道具 举报

7日久生情
4449/5000
排名
49
昨日变化

0

主题

290

帖子

4449

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
14133
好友
0
蛮牛币
5187
威望
0
注册时间
2014-2-12
在线时间
1743 小时
最后登录
2018-1-19
发表于 2017-12-25 11:46:23 | 显示全部楼层
看看,是个好资源。
[发帖际遇]: 一个袋子砸在了 leonbeyond007 头上,leonbeyond007 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
3539/5000
排名
169
昨日变化

15

主题

292

帖子

3539

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
67323
好友
1
蛮牛币
1563
威望
0
注册时间
2015-1-10
在线时间
1342 小时
最后登录
2018-1-19
发表于 2017-12-25 12:13:53 | 显示全部楼层
看起来很不错的样子

回复 支持 反对

使用道具 举报

7日久生情
3740/5000
排名
4242
昨日变化
25

5

主题

3095

帖子

3740

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
5
蛮牛币
4477
威望
0
注册时间
2017-3-1
在线时间
360 小时
最后登录
2018-1-19
发表于 2017-12-25 13:59:14 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
2177/5000
排名
17749
昨日变化
10

2

主题

1818

帖子

2177

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2826
威望
0
注册时间
2016-11-22
在线时间
331 小时
最后登录
2018-1-18
发表于 2017-12-25 14:33:38 | 显示全部楼层
赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

4四处流浪
372/500
排名
6178
昨日变化
5

0

主题

86

帖子

372

积分

Rank: 4

UID
133594
好友
0
蛮牛币
514
威望
0
注册时间
2016-1-5
在线时间
111 小时
最后登录
2018-1-19
发表于 2017-12-25 14:47:34 | 显示全部楼层
NPOI是什么?在哪里?

回复 支持 反对

使用道具 举报

排名
732
昨日变化
3

33

主题

481

帖子

2620

积分

Rank: 9Rank: 9Rank: 9

UID
1261
好友
36
蛮牛币
1459
威望
0
注册时间
2013-7-31
在线时间
608 小时
最后登录
2018-1-19

专栏作家社区QQ达人认证开发者

 楼主| 发表于 2017-12-25 15:21:03 | 显示全部楼层
ahmugame 发表于 2017-12-25 14:47
NPOI是什么?在哪里?

看文章有介绍

回复 支持 反对

使用道具 举报

5熟悉之中
602/1000
排名
4270
昨日变化
3

3

主题

73

帖子

602

积分

Rank: 5Rank: 5

UID
233810
好友
0
蛮牛币
1276
威望
0
注册时间
2017-7-24
在线时间
248 小时
最后登录
2018-1-15

活力之星迈向小康

发表于 2017-12-25 15:47:23 | 显示全部楼层
收藏,以后应该能用到

回复 支持 反对

使用道具 举报

5熟悉之中
648/1000
排名
4587
昨日变化
25

18

主题

150

帖子

648

积分

Rank: 5Rank: 5

UID
148479
好友
1
蛮牛币
786
威望
0
注册时间
2016-5-13
在线时间
224 小时
最后登录
2018-1-19
发表于 2017-12-25 17:39:30 | 显示全部楼层
厉害!!!!!!

回复

使用道具 举报

5熟悉之中
759/1000
排名
4221
昨日变化
18

7

主题

170

帖子

759

积分

Rank: 5Rank: 5

UID
123828
好友
4
蛮牛币
1099
威望
0
注册时间
2015-9-24
在线时间
278 小时
最后登录
2018-1-19
发表于 2017-12-25 17:57:22 | 显示全部楼层
学习看看 学习看看 学习看看

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表