java操作excle
工作时候需要统计数据,一个个核对效率低下,就用poi操作吧,之前使用easypoi用的spring使用方便,奈何银行项目太老。不多说上代码。
package com.yucheng.cmis.retailloan.applrecv.mgr.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
public class ExcleTest {
/**
* @param args
*/
public static void main(String[] args) {
Map para = readExcel("E:\\CY\\tool\\县区表格.xls");
whiteExcel("D:\\微信\\WeChat Files\\wxid_9263662635212\\FileStorage\\File\\2020-07\\码值数据.xls",para);
}
public static Map<String,String> readExcel(String excelPath){
Map<String,String> result = new HashMap<String, String>();
Map<String,String> result1 = new HashMap<String, String>();
try {
InputStream is = new FileInputStream(excelPath);
POIFSFileSystem fs = new POIFSFileSystem(is);
HSSFWorkbook hssWb = new HSSFWorkbook(fs);
HSSFSheet hssSheet = hssWb.getSheetAt(0);
int rowNum = hssSheet.getLastRowNum();
int m=0;
for (int i = 0; i < rowNum + 1; ++i) {
HSSFRow hssRow = hssSheet.getRow(i);
if(!result.containsKey(hssRow.getCell(0).toString())){
if(hssRow.getCell(1) != null){
result.put(hssRow.getCell(0).toString(),hssRow.getCell(1).toString());
}
}else{
result.remove(hssRow.getCell(0).toString());
m = m+1;
}
}
System.out.println(result.size());
System.out.println(result1.size());
System.out.println(m);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
//D:\微信\WeChat Files\wxid_9263662635212\FileStorage\File\2020-07
public static void whiteExcel(String excelPath,Map<String,String> map){
try {
HSSFWorkbook xwb = new HSSFWorkbook(new FileInputStream(excelPath));
HSSFSheet xSheet = xwb.getSheetAt(0); //获取excel表的第一个sheet
for (int i = 3712; i <= 6993; i++) { //遍历所有的行
if(xSheet.getRow(i)==null){ //这行为空执行下次循环
continue;
}
if(xSheet.getRow(i).getCell(3)==null){//为空执行下次循环
continue;
}
String [] key = xSheet.getRow(i).getCell(3).toString().split(",");//获取当前单元格的数据
int max = key.length;
if(map.containsKey(key[max-1])){
HSSFCell xCell = xSheet.getRow(i).getCell(4);
if(map.get(key[max-1]) != null){
xCell.setCellValue(map.get(key[max-1]).substring(0, map.get(key[max-1]).length()-2));
}
}
}
FileOutputStream out = new FileOutputStream(excelPath);
xwb.write(out);
out.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
此处表格使用的是2003版 xls,2007 xlsx同理,虽然代码简单,但是主要就是记录下操作过程,以后要用就CV。
操作步骤
1.获取文件。
2.流读取。
3.获取表->获取sheet->获取row->获取cell。(都是从0开始)
4.输出流,写的时候关闭文件,要么写不进去。
剩下就是业务数据的补充了,根据业务需求自己来吧。
注意下:遇到的问题
如果获取cell为5,单元格取到是null。