前言:

前些天遇到了这样的一个需求,将下图:

将表格中货号-前面部分一致的行合成一行,并且将第二行,第三行的价格添加到第一行中为价格二,价格三。如图:

接到这样的需求,我的第一感觉是直接手动合并(暗暗再想这也太简单了),然后我看了总记录数我放弃了,决定在网上找找excel的操作方法,找了一会没发现,心想不能浪费太多时间,不如自己动手丰衣足食,可能也是小弟(刚刚说老汉被批评了)比较愚昧,毕竟没怎么学过excel,望有会的大神留言,也当学习了。好了废话不多说了,接下来让我们来看看如何实现的吧。

首先想要实现此功能需要将读入excel表格,我这里使用的是HSSFWorkbook,因为用的是03版,如果想要兼容07版可以访问此博客http://www.cnblogs.com/yejg1212/p/3969822.html,我这就不多做介绍。想要读入文件我们首先是要得到这个文件流,即:

InputStream is = new FileInputStream("C://jlo.xls");

然后利用HSSFWorkbook读取,首先读取sheet,找到自己想要的sheet,获取循环所有行得到每列的值,如下:

 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
HashMap<String, String> map = new HashMap<>();
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 循环行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null) {
continue;
}
}
}

  我这里为了更好的保存的,所以我建了一个实体类用于保存所获得值,写着写着突然停了,蒙了,我该如何将货号一样的内容拼接成一个实体类中了,想了想用数据库肯定不合适,太影响性能,所以机智的我选择了全局变量,类似于缓存,因为根据本excel显示规则,最多有三个会相同,而其他内容都是一致,所以只需要将相同的每一行的价格记录下来,保存到HashMap集合中,将其全部保存至最后一个实体model中,并且将其放入用于缓存的全局变量hashMap中,最后将其hashMap中所有value值即是处理后实体进行循环写入一个excel中,哇,就这么完成了。有点简单的,比在网上找excel操作并且还找不到感觉要快。接下来就是读取excel的具体代码实现:

 /**
* 读取xls文件内容
*
* @throws IOException
* 输入/输出(i/o)异常
*/
private void readXls() throws IOException {
InputStream is = new FileInputStream("C://jlo.xls");
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
HashMap<String, String> map = new HashMap<>();
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 循环行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null) {
continue;
}
XlsDto xld = new XlsDto();
xld.setSmiles(getValue(hssfRow.getCell(0)));
xld.setHuoHao(getValue(hssfRow.getCell(1)).substring(0,getValue(hssfRow.getCell(1)).indexOf("-")));
xld.seteName(getValue(hssfRow.getCell(2)));
xld.setcName(getValue(hssfRow.getCell(3)));
xld.setCas(getValue(hssfRow.getCell(4)));
xld.setHuoDate(getValue(hssfRow.getCell(5)));
xld.setPurity(getValue(hssfRow.getCell(6)));
xld.setKunCun(getValue(hssfRow.getCell(7)));
xld.setIsCreate(getValue(hssfRow.getCell(8)));
xld.setaCost(getValue(hssfRow.getCell(9)));
xld.setxType(getValue(hssfRow.getCell(1)).substring(0,getValue(hssfRow.getCell(1)).indexOf("-")));
if(StringUtils.isNotBlank(getValue(hssfRow.getCell(1)))){
if(!map.containsKey(xld.getxType())){
String cost = getValue(hssfRow.getCell(9));
//insertX(xld);
hashMap.put(xld.getxType(), xld);
map.put(xld.getxType(), "1");
map.put(xld.getxType()+"1", cost);
}else{
//String xType = getValue(hssfRow.getCell(1)).substring(0,getValue(hssfRow.getCell(1)).indexOf("-"));
if("1".equals(map.get(xld.getxType()))){
String cost = getValue(hssfRow.getCell(9));
xld.setaCost(map.get(xld.getxType()+"1"));
xld.setbCost(cost);
hashMap.put(xld.getxType(), xld);
//updateX(xType, cost,1);
map.put(xld.getxType(), "2");
map.put(xld.getxType()+"2", cost);
}else{
String cost = getValue(hssfRow.getCell(9));
xld.setaCost(map.get(xld.getxType()+"1"));
xld.setbCost(map.get(xld.getxType()+"2"));
xld.seteCost(cost);
hashMap.put(xld.getxType(), xld);
//updateX(xType, cost,2);
map.put(xld.getxType(), "3");
}
} }
}
}
}

  处理完成之后,将其再次导入给excel,实现如下:

/**
*
* @param xls
* XlsDto实体类的一个对象
* @throws Exception
* 在导入Excel的过程中抛出异常
*/
public static void xlsDto2Excel(List<XlsDto> xls) throws Exception {
// 获取总列数
int CountColumnNum = xls.size();
// 创建Excel文档
HSSFWorkbook hwb = new HSSFWorkbook();
XlsDto xlsDto = null;
// sheet 对应一个工作页
HSSFSheet sheet = hwb.createSheet("sheet1");
HSSFRow firstrow = sheet.createRow(0); // // 下标为0的行开始
HSSFCell[] firstcell = new HSSFCell[CountColumnNum];
String[] names = new String[12];
names[0] = "SMILES";
names[1] = "货号";
names[2] = "产品名称(英文";
names[3] = "产品名称(中文";
names[4] = "CAS号";
names[5] = "货期(天)";
names[6] = "纯度";
names[7] = "库存";
names[8] = "是否可定制";
names[9] = "包装/价格1";
names[10] = "包装/价格2";
names[11] = "包装/价格3";
for (int j = 0; j < 12; j++) {
firstcell[j] = firstrow.createCell(j);
firstcell[j].setCellValue(new HSSFRichTextString(names[j]));
}
for (int i = 0; i < xls.size(); i++) {
// 创建一行
HSSFRow row = sheet.createRow(i + 1);
// 得到要插入的每一条记录
xlsDto = xls.get(i);
// 在一行内循环
HSSFCell xh = row.createCell(0);
xh.setCellValue(xlsDto.getSmiles());
HSSFCell xm = row.createCell(1);
xm.setCellValue(xlsDto.getHuoHao());
HSSFCell yxsmc = row.createCell(2);
yxsmc.setCellValue(xlsDto.geteName());
HSSFCell kcm = row.createCell(3);
kcm.setCellValue(xlsDto.getcName());
HSSFCell cj = row.createCell(4);
cj.setCellValue(xlsDto.getCas());
HSSFCell hd = row.createCell(5);
hd.setCellValue(xlsDto.getHuoDate());
HSSFCell purity = row.createCell(6);
purity.setCellValue(xlsDto.getPurity());
HSSFCell kuncun = row.createCell(7);
kuncun.setCellValue(xlsDto.getKunCun());
HSSFCell isc = row.createCell(8);
isc.setCellValue(xlsDto.getIsCreate());
HSSFCell ac = row.createCell(9);
ac.setCellValue(xlsDto.getaCost());
HSSFCell bc = row.createCell(10);
bc.setCellValue(xlsDto.getbCost());
HSSFCell ec = row.createCell(11);
ec.setCellValue(xlsDto.geteCost()); }
// 创建文件输出流,准备输出电子表格
OutputStream out = new FileOutputStream("C://jlol.xls");
hwb.write(out);
out.close();
System.out.println("数据库导出成功");
}

  完美的解决了这个比较特殊而又不特殊的需求,代码提供仅供互相大家学习,欢迎访问提点不足之处。

excel表格的特殊需求引发的Java思考的更多相关文章

  1. java 操作Excel表格

    对于Excel表格的解析.生成,java在 org.apache.poi 包中已经封装好了,使用比较简单. 解析Excel: 首先将File文件转成InputStream InputStream in ...

  2. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  3. Java导出数据行写入到Excel表格:基于Apache POI

    Java导出数据行写入到Excel表格:基于Apache POI import java.io.File; import java.io.FileOutputStream; import org.ap ...

  4. java连接MongoDB查询导出为excel表格

    背景 因为项目需求.每一个星期须要统计每一个公众号7天的訪问数,月底就须要统计一个月的訪问数,40多个公众号.每次手动统计都须要花费1个小时,总之是一项无技术耗时耗神的手工活. 于是.想写个程序来统计 ...

  5. 使用java程序jxl操作Excel表格

    在实际开发中企业办公系统都会涉及到一个打印报表的功能,也许你的需求就是把web前端展示的员工信息以Excel表格形式打印出来 ,那么具体怎么操作下面我来实现一下 首先我们使用的是 java的jxl技术 ...

  6. java解析导入excel表格转为实体类javabean,根据实体类中的中文名称

    最近公司需求解析excel,一开始使用poi做的挺好的,后来直接上了几十万条数据的excel文件,内存直接溢出了,网上查到apache poi还提供了专门处理海量数据的方法,使用sax解析,果然用了内 ...

  7. 使用Java操作Excel表格

    目录 一.配置第三方库 二.使用Apache POI API 1. 打开Excel文件 2. 选择对应的sheet 3. Sheet接口的基本使用 3.1 获取开头行和结束行 3.2 获取Row对象 ...

  8. Java JTable 表格 获取存储路径,文件名 ,导出excel表格

    在做计量泵上位机软件时,需要将下位机传上来的数据,存入MYSQL数据库,显示在java 上位机界面上,并能导出至电脑指定位置. 选择存储路径和文件名: // 处理另存文件的菜单 public void ...

  9. java导出excel表格

    java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...

随机推荐

  1. sencha cmd常用命令汇总

    一.sencha generate:自动生成项目或者代码 1.sencha generate app 项目名称 生成路径 :生成一个新的extjs项目 注明:以上命令会从官网下载试用版本的ext代码到 ...

  2. 重启机器解决SSL都要输入密码问题

    在Nginx或Apache设置了SSL加密后,发现每次重启服务器后都要输入证书设置的密码,比较麻烦,不然Nginx或Apache无法使用,这时可以用私钥来做这件事.生成一个解密的key文件,替代原来k ...

  3. 一起学JUCE之HashMap

    基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同.) ...

  4. MYsql数据库ERROR总结

    描述:#Warning: Using a password on the command line interface can be insecure.#ERROR 1045 (28000): Acc ...

  5. java实现——007用两个栈实现队列

    import java.util.Stack; public class T007 { public static void main(String[] args) { Queue q = new Q ...

  6. md5-linux_shell

    linux shell提供md5sum用于计算校验MD5值. md5sum - compute and check MD5 message digest md5sum [OPTION]... [FIL ...

  7. UVa 10306 - e-Coins

    题目大意:现在有一种新型货币,它的价值分为传统价值x和IT价值y,价值计算方式为sqrt(x*x+y*y),现给一些类型的货币和要达到的目标价值,计算达到目标所需的最少货币数目.注意计算方法是sqrt ...

  8. [Angular Tutorial] 4 - Directory and File Organization

    在这一步中,我们将不会在我们的应用中添加任何新功能,相反,我们打算退回一步,重构我们的代码库,移动我们的代码和文件,以此来使我们的应用更具易扩展性和可维护性. 在先前的步骤中,我们已经见识到了如何将我 ...

  9. PHP 合并数组 追加数组例子

    PHP合并数组我们可以使用array_merge()函数,array_merge()函数返回一个联合的数组.所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次追加.其形式为: arra ...

  10. 我用Cocos2d-x模拟《Love Live!学院偶像祭》的Live场景(四)

    [前言和思路整理] 千呼万唤Shǐ出来!最近莫名被基友忽悠着进舰坑了,加上要肝LL活动,又碰上公司项目紧张经常加班,这一章发得比以往时候来得更晚一些,抱歉啊. 上一章我们实现了BeatObjectMa ...