java excel row遍历空_Java poi读取,写入Excel,处理row和cell可能为空的情况

首先需要导入包

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

然后写方法,由于我使用的框架全部是spring

此处我只写入实现层和控制层代码

@Override

public InputStream loadMatComYearPlanXls(String MAT_NO_, String MAT_DESC_, Integer MAT_TYPE_, String MAT_SPEC_CAT_CODE_, String COM_CODE_, String DEPT_CODE_, Integer YEAR_, Integer MONTH_, String MAT_BUDGET_CAT_ID_, String MAT_YEAR_PLN_BATCH_ID_, Map operator) {

NPOIFSFileSystem fs = null;

Workbook workbook = null;

ByteArrayOutputStream baos = new ByteArrayOutputStream();

try {

File file = new File(this.getClass().getResource("/../../resource/matComYearPlan.xls").getFile());

FileInputStream inputStream = new FileInputStream(file);

fs = new NPOIFSFileSystem(inputStream);

workbook = (Workbook) new HSSFWorkbook(fs.getRoot(), true);

Sheet sheet = workbook.getSheetAt(0);

List> matYearPlanList = selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, 1, -1, operator);

List> matTypedmCodeList = dmCodeService.selectDmCodeByGroupName("MAT_TYPE_", operator);

List> processStatusTypedmCodeList = dmCodeService.selectDmCodeByGroupName("PROCESS_STATUS_TYPE_", operator);

List> matBudgetCatList = matBudgetCatService.selectMatBudgetCat(1, -1, operator);

List> matSpecCatList = matSpecCatService.selectMatSpecCat(1, -1, operator);

Map matYearPlan;

String MAT_BUDGET_CAT_NAME_ = "";

String PARENT_MAT_BUDGET_CAT_ID_;

for (int i = 0; i < matYearPlanList.size(); i++) {

matYearPlan = matYearPlanList.get(i);

Row row = sheet.createRow(i + 1);

row.createCell(0).setCellValue((String) matYearPlan.get("MAT_NO_"));

row.createCell(1).setCellValue((String) matYearPlan.get("MAT_DESC_"));

row.createCell(2).setCellValue((String) matYearPlan.get("LARGE_MAT_CAT_CODE_"));

row.createCell(3).setCellValue((String) matYearPlan.get("UNIT_"));

if (matYearPlan.get("PLANNED_PRICE_") != null) {

row.createCell(4).setCellValue(((BigDecimal) matYearPlan.get("PLANNED_PRICE_")).doubleValue());

}

if (matYearPlan.get("AMOUNT_") != null) {

row.createCell(5).setCellValue(((BigDecimal) matYearPlan.get("AMOUNT_")).doubleValue());

}

if (matYearPlan.get("PLANNED_PRICE_") != null && matYearPlan.get("AMOUNT_") != null) {

row.createCell(6).setCellValue(((BigDecimal) matYearPlan.get("PLANNED_PRICE_")).doubleValue() * ((BigDecimal) matYearPlan.get("AMOUNT_")).doubleValue());

}

if (matYearPlan.get("MAT_TYPE_") != null) {

for (int j = 0; j < matTypedmCodeList.size(); j++) {

Map matTypedmCode = matTypedmCodeList.get(j);

if ((((BigDecimal) matYearPlan.get("MAT_TYPE_")).intValue()) == (((BigDecimal) matTypedmCode.get("CODE_"))).intValue()) {

row.createCell(7).setCellValue((String) matTypedmCode.get("VALUE_"));

break;

}

}

}

row.createCell(8).setCellValue((String) matYearPlan.get("DEPT_NAME_"));

for (int j = 0; j < matBudgetCatList.size(); j++) {

Map matBudgetCat = matBudgetCatList.get(j);

if (((String) matYearPlan.get("MAT_BUDGET_CAT_ID_")).equals((String) matBudgetCat.get("MAT_BUDGET_CAT_ID_"))) {

MAT_BUDGET_CAT_NAME_ = (String) matBudgetCat.get("MAT_BUDGET_CAT_NAME_");

PARENT_MAT_BUDGET_CAT_ID_ = (String) matBudgetCat.get("PARENT_MAT_BUDGET_CAT_ID_");

while (PARENT_MAT_BUDGET_CAT_ID_ != null) {

for (int k = 0; k < matBudgetCatList.size(); k++) {

matBudgetCat = matBudgetCatList.get(k);

if (PARENT_MAT_BUDGET_CAT_ID_.equals((String) matBudgetCat.get("MAT_BUDGET_CAT_ID_"))) {

MAT_BUDGET_CAT_NAME_ = (String) matBudgetCat.get("MAT_BUDGET_CAT_NAME_") + "/" + MAT_BUDGET_CAT_NAME_;

PARENT_MAT_BUDGET_CAT_ID_ = (String) matBudgetCat.get("PARENT_MAT_BUDGET_CAT_ID_");

break;

}

}

}

row.createCell(9).setCellValue("/" + MAT_BUDGET_CAT_NAME_ + "/");

break;

}

}

if (matYearPlan.get("MAT_SPEC_CAT_CODE_") != null) {

for (int j = 0; j < matSpecCatList.size(); j++) {

Map matSpecCat = matSpecCatList.get(j);

if (((String) matYearPlan.get("MAT_SPEC_CAT_CODE_")).equals((String) matSpecCat.get("CODE_"))) {

row.createCell(10).setCellValue((String) matSpecCat.get("VALUE_"));

break;

}

}

}

if (matYearPlan.get("PROCESS_STATUS_") != null) {

for (int j = 0; j < processStatusTypedmCodeList.size(); j++) {

Map processStatusTypedmCode = processStatusTypedmCodeList.get(j);

if ((((BigDecimal) matYearPlan.get("PROCESS_STATUS_")).intValue()) == (((BigDecimal) processStatusTypedmCode.get("CODE_")).intValue())) {

row.createCell(11).setCellValue((String) processStatusTypedmCode.get("VALUE_"));

break;

}

}

}

}

workbook.write(baos);

baos.flush();

byte[] bytes = baos.toByteArray();

return new ByteArrayInputStream(bytes, 0, bytes.length);

}

catch (Exception e) {

e.printStackTrace();

return null;

}

finally {

try {

fs.close();

workbook.close();

baos.close();

}

catch (IOException e) {

}

}

}

其中有个selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, 1, -1, operator);方法是我的业务方法,可根据需要改变自己实际的参数,对自己的代码进行修改

Row row = sheet.createRow(i + 1);

row.createCell(0).setCellValue((String) matYearPlan.get("MAT_NO_"));

这两句代码是与其他人不同的地方,有些人的代码是getRow(),getCell()。那样很可能会报空指针异常,如果以前有数据只是对其覆盖可以使用,如果以前没有数据,是动态生成的最后使用create方法

另外我在代码中大量使用了String造型,而不是toString()方法,因为String相对于tostring()方法更安全,而其不会报空指针异常。而toString()方法有时会需要重写,不是那么安全。

=null.toString()会有空指针异常,而 =(String)null则不会。

//控制层代码

@RequestMapping(value = "loadMatComYearPlanXls")

public void loadMatComYearPlanXls(String MAT_NO_, String MAT_DESC_, Integer MAT_TYPE_, String MAT_SPEC_CAT_CODE_, String COM_CODE_, String DEPT_CODE_, Integer YEAR_, Integer MONTH_, String MAT_BUDGET_CAT_ID_, String MAT_YEAR_PLN_BATCH_ID_, HttpServletRequest request, HttpServletResponse response, HttpSession session) {

try {

Map operator = getOperator(session);

InputStream inputStream = matYearPlanService.loadMatComYearPlanXls(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, operator);

response.reset();

String fileName = URLEncoder.encode("厂矿年计划表.xls", "UTF-8");

response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

ServletOutputStream out = response.getOutputStream();

byte[] content = new byte[65535];

int length = 0;

if (inputStream != null) {

while ((length = inputStream.read(content)) != -1) {

out.write(content, 0, length);

}

}

out.flush();

out.close();

}

catch (Exception e) {

insertBizLog("业务", "MatYearPlanController.loadMatComYearPlanXls", null, null, null, null, null, 1, e.getMessage(), request, session);

logger.error(e.getMessage(), e);

}

insertBizLog("业务", "MatYearPlanController.loadMatComYearPlanXls", null, null, null, null, null, 0, null, request, session);

}

控制层主要是调用实现层代码。主要的POI代码在实现层,网上有很多这类代码,只是我自己对空指针的处理做了自己的改变,网络上说的很多方法不全。

另外这这次的业务实现里,有个BigDecimal类型,http://baike.baidu.com/link?url=abJmNaoqJGE0RbYpjmOCB4otjPPqhpwYPSlMkVwPV6c_0V8I42VljBvaDtCI6h-xNIn5N5CFjrWPvvz4A132lK

由于将值放进map时都是Object类型,但在取出时,它的类型并没有丢失,所以在.intValue(),和.doubleValue()取值时,与String不同,同时需要做空值处理

如果不想使用造型可以使用parse解析。

中间有段代码是做的树形的循环递归遍历。

//在jsp页面的调用

function _loadMatComYearPlanXls() {

var MAT_BUDGET_CAT_ID_ = '';

var records = Ext.getCmp('matBudgetCatPanel').getSelectionModel().getSelection();

if (records.length != 0) {

MAT_BUDGET_CAT_ID_ = records[0].get('MAT_BUDGET_CAT_ID_');

}

window.open('loadMatComYearPlanXls.do?YEAR_=' + Ext.getCmp('YEAR_').getSubmitValue() + '&MONTH_=' + Ext.getCmp('MONTH_').getSubmitValue() + '&MAT_TYPE_=' + Ext.getCmp('MAT_TYPE_').getSubmitValue() + '&MAT_YEAR_PLN_BATCH_ID_=' + Ext.getCmp('MAT_YEAR_PLN_BATCH_ID_').getSubmitValue() + '&DEPT_CODE_=' + Ext.getCmp('DEPT_CODE_').getSubmitValue() + '&MAT_NO_=' + Ext.getCmp('MAT_NO_').getSubmitValue() + '&MAT_DESC_=' + Ext.getCmp('MAT_DESC_').getSubmitValue() + '&MAT_SPEC_CAT_CODE_=' + Ext.getCmp('MAT_SPEC_CAT_CODE_').getSubmitValue() + '&COM_CODE_=' + COM_CODE_ + '&MAT_BUDGET_CAT_ID_=' + MAT_BUDGET_CAT_ID_, '_blank', 'width=40,height=30,resizable=yes,scrollbars=yes');

}

JSP页面只是调用控制层代码,如果自己有需要,可以按自己的方法传参调用。

poi的API文档:http://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html#SXSSFWorkbook(org.apache.poi.xssf.usermodel.XSSFWorkbook)

对最后一行需要数值总计的处理:

if (i == matContractStockIoList.size() - 1) {

row = sheet.createRow(i + 2);

row.createCell(0).setCellValue("合计 :");

row.createCell(5).setCellFormula("SUM(F2:F" + (i + 2) + ")");

row.createCell(6).setCellFormula("SUM(G2:G" + (i + 2) + ")");

}

欢迎大家阅览,多多评论其中的不足!!

为工程师之路添砖加瓦!!

Java poi读取&comma;写入Excel2003

Java poi读取,写入Excel2003 相关阅读:poi读写Excel2007:http://www.cnblogs.com/gavinYang/p/3576741.htmljxl读写excel ...

Java poi读取&comma;写入Excel2007

Java poi读取,写入Excel2007 相关阅读:poi读写Excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmljxl读写excel ...

POI读取&sol;写入Excel文件

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

poi读取写入word【未完,待续】

, [项目实战]Java POI之Word导出经典案例一 Java POI 读取word文件 POI-对于WORD的操作(一)

Java——poi读取Excel文件

1.创建文件流,打开EXCEL文件 FileInputStream excelFile = new FileInputStream(excelPath); XSSFWorkbook workbook ...

Java入门开发POI读取导入Excel文件

Apache POI是Apache开发的开源的跨平台的 Java API,提供API给Java程序对Microsoft Office格式档案进行各种操作. POI中Excel操作很简单,主要类有 HS ...

Java POI 读取Excel数据转换为XML格式

1.首先要下载poi相关的包:http://poi.apache.org/  ,以下是所需的jar包 2.贴上详细的代码 public class ExcelToXml { /** * 将excel的 ...

JXL读取&comma;写入Excel

JXL读取,写入Excel2003 相关阅读:poi 读写excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmlpoi 读写excel200 ...

java POI实现向Excel中插入图片

做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...

随机推荐

1130mysql explain中的type列含义和extra列的含义

很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义. 1 type列 官方的说法,说这列表示的是"访问类型&quot ...

Java throws子句是怎么写的呢?

如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常.做到这点你可以在方法声明中包含一个throws子句.一个 throws 子句列举了一个方法可能抛 ...

MyBatis增删改查

MyBatis的简介: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...

更新Code First生成的数据库

1,首次访问时会自动生成数据库 2,某个Model增加一个字段后,再次访问会报,数据库不是最新 操作 1,Enable-Migrations 注意选择Default project为Star.Core ...

【原创】Github团队协作之Pull请求

首先声明:Github上关于代码团队协作方式有很多种,这里只讲述Github上其中的一种代码团队协作方式.   Pull请求(Pull request) 1 综述     协作者通过fork一个新的代 ...

Serv-u 备份处理

需求分析 从删库到跑路,大家听过很多,但如果没删备份的话,那只能说玩的不够彻底,不专业.系统管理员一个非常重要的职责就是定期备份,以便在系统出现故障的时候能够及时恢复.我们来看下如何备份Serv-u系 ...

JS用斜率判断鼠标进入DIV四个方向的方法 判断鼠标移入方向

本文要介绍的是一种鼠标从一个元素移入移出时,获取鼠标移动方向的思路.这个方法可以帮助你判断鼠标在移入移出时,是从上下左右的哪个方向发生的.这个思路,是我自己琢磨出来,利用了一点曾经高中学过的数学知识, ...

第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...

Mac 命令行美化

在 mac 中使用原生的命令行工具,竟然没有 git 命令的自动补全,在 git 仓库下也看不到当前的分支名,不能忍.于是,开始一波改造. 目标:命名 Tab 自动补全:可以显示分支名: 一番 Goo ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery常用选择器总结

作为网站开发者来说&#xff0c;不可避免的需要和页面打交道&#xff0c;很多时候都需要去操作一些页面上的元素&#xff0c;掌握常用的Jquery选择器是十分有必要的。现从网上整理一些常用的Jquery选择器&#xff0c;希望能给大家带来一些开发上的便利。一、基本选择器&#xf…

java 常量 内存分配_Java内存分配之堆、栈和常量池

寄存器&#xff1a;最快的存储区&#xff0c;位于不同于其他存储区的地方——处理器内部。寄存器的数量极其有限&#xff0c;所以寄存器由编译器根据需求 进行分配。你不能直接控制&#xff0c;也不能在程序中感觉到寄存器存在的任何迹象。栈&#xff1a;存放基本类型的数据和对…

三种SQLServer分页查询语句笔记

作为程序员来说&#xff0c;与数据库打交道是十分频繁的分页查询是一个开发者必须掌握的基本知识点&#xff0c;目前整理了下面三种SQLServer分页查询语句的写法&#xff0c;仅供参考。一、Top Not IN 方式&#xff08;查询靠前的数据较快&#xff09;语法格式&#xff1a;sele…

sqlserver2008r2安装

转载于:https://www.cnblogs.com/sprinng/p/4932739.html

JQuery七个常犯的错误

1、 乱用选择器JQuery选择器调用代价很大&#xff0c;反复调用效率更低。应采用缓存对象的方法或采用链式调用的方式。//错误的写法$("#button").click(function(){ $(#list li).addClass(strong); $(#list li).css(color,red);});//正确的写法$("#button…

java流读取xml_使用FileInputStream(用于Java)读取XML文件?

这是交易.对于我的项目,我必须使用Java和XStream对随机树进行序列化和反序列化.我的老师制作了Tree / RandomTree算法,所以我不必担心.我不知道该怎么做是这样的&#xff1a;我使用FileInputStream来读/写我序列化和反序列化的xml文件,但是当我反序列化时,我不知道用于读取文件…

后台寻路系统的大体思路与流程

总的思路就是: 1, 通过前台unity的navigation的的接口: 获得顶点和三角形集合数据 2, 将前台的mesh数据转换成标准的obj格式数据 3. 强obj mesh数据经过一系列转换和优化, 生成recastnavigation插件寻路模块detour需要的导航数据 故制作了工具MakeNavmeshData生成detour需要的…

关于WCF、WebAPI、WCFREST、WebService之间的区别总结

在.net平台下&#xff0c;有大量的技术让你创建一个HTTP服务&#xff0c;像Web Service&#xff0c;WCF&#xff0c;现在又出了Web API。在.net平台下&#xff0c;你有很多的选择来构建一个HTTP Services。我分享一下我对Web Service、WCF以及Web API的看法。一、Web Service1、…

java 程序是由什么组成的 java_从零开始的JAVA -2. java程序的构成及命名规则

1.public classYD2.{3. public static voidmain (string args[ ])4. {5. System.out.println("我是一名学习JAVA的新人&#xff01;");6. }7.}第一行 public 代表这是一个公共类(可省略) class 是声明一个类&#xff0c;在他后面的YD 就是类名(类名可以随意写)第二行…

你应该知道的jQuery技巧【收藏】

jQuery的存在&#xff0c;让学习前端开发的人感到前端越来越容易入门了&#xff0c;用简单的几行代码就可以实现需求&#xff0c;但是&#xff0c;你真的会用jQuery么&#xff0c;当代码运行 后无法看到自己预期的效果&#xff0c;是不是觉得jQuery出了问题&#xff0c;其实&am…

LINQ表达式用法整理

收集一些Linq表达式中的一些比较常用的写法&#xff0c;希望能给大家工作当中带来一些便利。1. Where子句条件过滤结果集型&#xff08;集合数据使用这种&#xff0c;譬如数组、列表数据&#xff0c;同样适用于Datatable等多列数据集&#xff09;类SQL语句的写法&#xff0c;对…

Eclipse is running in a JRE, but a JDK is required 解决方法(转)

转自&#xff1a;http://comeonbabye.iteye.com/blog/1186239 安装Maven后每次启动出现警告信息: Eclipse is running in a JRE, but a JDK is requiredSome Maven plugins may not work when importing projects or updating source folders. 分两步解决问题: 1. 检查Eclipse正…

java线程归并排序_Java-归并排序 - FeanLau的个人空间 - OSCHINA - 中文开源技术交流社区...

public class MergeSort {static int number0;public static void main(String[] args) {int[] a {26, 5, 98, 108, 28, 99, 100, 56, 34, 1 };printArray("排序前&#xff1a;",a);MergeSort(a);printArray("排序后&#xff1a;",a);}private static voi…

收集一些优秀的DoNet开源项目

Paste_Image.pngJson.NEThttp://json.codeplex.com/ Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json&#xff0c;通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中所有类型(对象,基…

git初探

1 Linux下Git和GitHub环境的搭建 第一步&#xff1a; 安装Git&#xff0c;使用命令 “sudo apt-get install git” 第二步&#xff1a; 到GitHub上创建GitHub帐号 第三步&#xff1a; 生成ssh key&#xff0c;使用命令 “ssh-keygen -t rsa -C "your_emailyouremail.com&q…

java编程思想 初始化_《java编程思想》_第五章_初始化与清理

初始化和清理是涉及安全的两个问题&#xff0c;java中采用了构造器&#xff0c;并额外提供了“垃圾回收器”&#xff0c;对于不再使用的内存资源&#xff0c;垃圾回收器能自动将其释放。一、用构造器确保初始化java中&#xff0c;通过提供构造器&#xff0c;类的设计者可以确保…

OkHttp 上手

OkHttp 上手 优点 快、节省带宽。支持 HTTP&#xff0f;2 和 SPDY。HTTP&#xff0f;2 和 SPDY 允许对同一个主机的所有请求&#xff0c;使用一个 socket。如果不支持 SPDY 的话&#xff0c;可以用连接池减少请求等待时间。GZIP 缩小传输大小。缓存响应&#xff08;response ca…

关于Net开发中一些SQLServer性能优化的建议

一、 ExecuteNonQuery和ExecuteScalar 对数据的更新不需要返回结果集&#xff0c;建议使用ExecuteNonQuery。由于不返回结果集可省掉网络数据传输。它仅仅返回受影响的行数。如果只需更新数据用ExecuteNonQuery性能的开销比较小。 ExecuteScalar它只返回结果集中第一行的第一列…

jstl mysql_java – jsp jstl sql与mysql中的奇怪行为

在mysql中我有一个存储过程,其中包含一个sql&#xff1a;select firstname as i_firstname , lastname as i_lastname from roleuserwhere user_id uid ;我使用jstl代码来获取值&#xff1a; –call sp_select_username(?);${rows.i_firstname} ${rows.i_lastname}但是这个代…

C# 哈希表(Hashtable)用法笔记

一、什么是Hashtable&#xff1f;Hashtable 类代表了一系列基于键的哈希代码组织起来的键/值对。它使用键来访问集合中的元素。当您使用键访问元素时&#xff0c;则使用哈希表&#xff0c;而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项…