【POI】修改已存在的xls,新添一列后,再保存本文件+获取最大有效行号+获取单元格内容
使用POI版本:

①

②


③ ④

package com.poi.dealXlsx; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test; public class DealXlsx { /**
* ①有一组xlsx文件,每个xlsx中有一个工作簿。
* ②另外有一个xlsx中的某一个标准列
* ③从②中将标准列插入到①中的每一个文件的工作薄中
* ④对比①中第46列的数据和插入的这一列,看看每一行出现在新插入这一列的哪一行
* @throws IOException
* @throws InvalidFormatException
*/
@Test
public void dealXlsxS() throws IOException, InvalidFormatException{
insertOneLine();
readAllFile();
} /**
* 将包含的点插入到每一个xlsx中
* @throws InvalidFormatException
* @throws IOException
*/
public void insertOneLine() throws InvalidFormatException, IOException{ List<String> mutationIds = getList();
File file1 = new File("D:/基因数据测试");
File [] files = file1.listFiles(); for (int i = 0; i < files.length; i++) {
FileInputStream fileInputStream = new FileInputStream(files[i]); XSSFWorkbook workbook1 = new XSSFWorkbook(fileInputStream);
Sheet sheet1 = workbook1.getSheetAt(0); if(sheet1 != null){
Row row = null;
int lastRowNum = sheet1.getLastRowNum();
for (int i1 = 0; i1 < 4241; i1++) {
if(i1 > lastRowNum ){
row = sheet1.createRow(i1);
}else{
row = sheet1.getRow(i1);
}
if(row != null){
Cell cell = row.createCell(64);
cell.setCellValue(mutationIds.get(i1));
}
}
}
System.out.println("插入第"+(i+1)+"个文件");
FileOutputStream outPutStream = new FileOutputStream(files[i]);
workbook1.write(outPutStream);
outPutStream.close();
workbook1.close();
}
} /**
* 执行对比操作
* @throws IOException
* @throws InvalidFormatException
*/
public void readAllFile() throws IOException, InvalidFormatException{
File file = new File("D:/基因数据测试");
File [] files = file.listFiles();
//获取插入的标准列
List<String> mutationIds = getList();
for (File file2 : files) {
FileInputStream fileInputStream = new FileInputStream(file2); XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
Sheet sheet = workbook.getSheetAt(0);
if(sheet != null){
Row row = null;
//循环每一行
int maxRowNum = just4MaxRowNum(sheet);
for (int i = 0; i < maxRowNum; i++) {
row = sheet.getRow(i);
//如果是第一行 跳过
if(row.getRowNum() == 0){
Cell cell = row.createCell(65);
cell.setCellValue("目标行数");
continue;
}
//获取到46列的对比列 单元格中的数据
Cell cell = row.getCell(46);
String cellValue = getCellValue(cell);
//对数据进行截取
cellValue = cellValue.substring(cellValue.indexOf("=")+1, cellValue.indexOf(";"));
//将数据拆分或者放入数组中
String [] cVs = null;
if(cellValue.contains(",")){
cVs = cellValue.split(",");
}else{
cVs = new String[]{cellValue};
}
//对比List集合中的什么位置,返回位置,如果没有,返回-1
int thisNum = -1;
for (int i1 = 0; i1 < cVs.length; i1++) {
thisNum = mutationIds.indexOf(cVs[i1]);
if(thisNum > -1){
break;
}
} //如果存在值,将位置值写入最后一列
if(thisNum > -1){
cell = row.createCell(65);
cell.setCellValue(String.valueOf(thisNum+1));
} } }
FileOutputStream outPutStream = new FileOutputStream(file2);
workbook.write(outPutStream);
outPutStream.close();
workbook.close(); }
} /**
* 获取当前单元格内容
* @param cell
* @return
*/
public String getCellValue(Cell cell){
String cellVaule = null;
switch (cell.getCellType()) {
case 0: cellVaule = String.valueOf(cell.getNumericCellValue());break;
case 1: cellVaule = cell.getStringCellValue();break;
case 2: cellVaule = cell.getStringCellValue();break;
case 3: cellVaule = null;break;
case 4: cellVaule = String.valueOf(cell.getBooleanCellValue());break;
case 5: cellVaule = String.valueOf(cell.getErrorCellValue());break; default:cellVaule = null; break;
} return cellVaule.trim();
} /**
* 获取到包含的点 的数据 用于插入每一个xlsx中
* @return
* @throws InvalidFormatException
* @throws IOException
*/
public List<String> getList() throws InvalidFormatException, IOException{
File file = new File("D:/基因数据2/时代基因175精简版探针20170629定稿.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(file);
List<String> mutationIds = new ArrayList<String>();
Sheet sheet = workbook.getSheet("包含的点");
if(sheet != null){
Row row = null;
for (int i = 0; i < 4241; i++) {
row = sheet.getRow(i);
if(row != null){
mutationIds.add(getCellValue(row.getCell(4)));
}
} System.out.println("包含的点总共有:"+mutationIds.size());
} return mutationIds;
} /**
* 获取最大行数 由于人为原因 xls中某个单元格中内容虽然已经删除 但是单元格的对象依旧创建,因此需要自己获取有效行数
* @param sheet
* @return
*/
public int just4MaxRowNum(Sheet sheet){
int maxRowNum = sheet.getLastRowNum();//获取最大行号 但不是有效行号 for (int i = 5; i < maxRowNum; i++) {
Row row = sheet.getRow(i);
Cell cell = row.getCell(46);
if(cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK){//判断cell单元格为null或者单元格类型为blank就表示此单元格没有数据 那这一行的上一行就是有效行数
maxRowNum = i-1;
break;
}
}
return maxRowNum;
} }
【POI】修改已存在的xls,新添一列后,再保存本文件+获取最大有效行号+获取单元格内容的更多相关文章
- POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取
第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...
- poi 升级至4.x 的问题总结(POI Excel 单元格内容类型判断并取值)
POI Excel 单元格内容类型判断并取值 以前用 cell.getCachedFormulaResultType() 得到 type 升级到4后获取不到了 换为:cell.getCellType( ...
- 使用poi导出Excel,并设定单元格内容类型,抛出异常
本例子使用的是HSSF,为Excel2003提供处理方案. 设定为输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import o ...
- 1 npoi 网上 不用模板 设置密码 workbook.WriteProtectWorkbook("password", "admin"); 、、 2 locked.IsLocked = true; sheet1.ProtectSheet("password");NPOI操作EXCEL--设置密码才可以修改单元格内容 3 模板设置密码 确定原密码 设置新密码
1 workbook.WriteProtectWorkbook("password", "admin"); 还是可以进去 只读进去 可以编辑 编辑就另存为 ...
- 2.6.2 用NPOI操作EXCEL--设置密码才可以修改单元格内容
2.6.2 用NPOI操作EXCEL--设置密码 有时,我们可能需要某些单元格只读,如在做模板时,模板中的数据是不能随意让别人改的.在Excel中,可以通过“审阅->保护工作表”来完 ...
- WinForm------GridControl单元格内容修改外表样式
private void gridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDra ...
- POI Excel 单元格内容类型判断并取值
个人用到的 String birthdayVal = null; ...
- poi 取excel单元格内容时,需要判断单元格的类型,才能正确取出
以下内容非原创,原文链接http://blog.sina.com.cn/s/blog_4b5bc01101015iuq.html ate String getCellValue(HSSFCell ce ...
- 关于poi导出excel方式HSSFWorkbook(xls).XSSFWorkbook(xlsx).SXSSFWorkbook.csv的总结
1.HSSFWorkbook(xls) import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermo ...
随机推荐
- [POI2014] KUR-Couriers(洛谷P3567)
洛谷题目链接:[POI2014]KUR-Couriers 题目描述 Byteasar works for the BAJ company, which sells computer games. Th ...
- 报错!!!!!!!!!!!org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSessionRepositoryFilter' is defined
报错!!!!!!!!!!! 因用maven项目不是很熟练,经常在Maven转Web项目(为什么要转web项目?因为要在tomcat中跑起来.maven项目好像是可以直接部署到tomcat的,或集成to ...
- 【BZOJ】5010: [Fjoi2017]矩阵填数
[算法]离散化+容斥原理 [题意]给定大矩阵,可以每格都可以任意填1~m,给定n个子矩阵,要求满足子矩阵内的最大值为vi,求方案数. n<=10,h,w<=1w. [题解] 此题重点之一在 ...
- 如何使主机和虚拟机IP处于同一网段(内网渗透专用)
先说一下正常流程: 1.打开虚拟机网络设置选项,选择桥接模式(Bridged)[如果是Kali 2.0的话,执行第一步后就OK了(90%)] 2.打开Kali里面的网络设置 3.设置一个ip4或者ip ...
- 2017年上海金马五校程序设计竞赛:Problem C : Count the Number (模拟)
Description Given n numbers, your task is to insert '+' or '-' in front of each number to construct ...
- python面向对象——类和对象
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程(流水线式) 优点:极大的降低了程序的复杂度 缺点:应用场景固定住了,可扩展性差 2.函数式编程 特点: a ...
- Django【进阶】序列化
关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 方案一:serializers 1 2 3 4 5 fromdjango.cor ...
- [Leetcode Week8]Subsets II
Subsets II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/subsets-ii/description/ Description Given ...
- 【 Linux 】三大主流软件负载均衡器对比(LVS、Nginx、HAproxy)
三大主流软件负载均衡器对比(LVS.Nginx.HAproxy) (资料来自网络,做了部分的补充说明) LVS: 1. 抗负载能力强,性能高,能达到F5的60%,对内存和CPU资源消耗比较低 ...
- 【 Python 】函数的参数
一.默认参数: 默认参数可以简化函数的调用,设置默认参数时,有几点要注意: 1,必选参数在前,默认参数在后,否则python的解释器会报错. 2,如何设置默认参数. 当函数有多个参数时,把变化大的参数 ...