使用POI版本:

③ ④

  1. package com.poi.dealXlsx;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9.  
  10. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  11. import org.apache.poi.ss.usermodel.Cell;
  12. import org.apache.poi.ss.usermodel.Row;
  13. import org.apache.poi.ss.usermodel.Sheet;
  14. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  15. import org.junit.Test;
  16.  
  17. public class DealXlsx {
  18.  
  19. /**
  20. * ①有一组xlsx文件,每个xlsx中有一个工作簿。
  21. * ②另外有一个xlsx中的某一个标准列
  22. * ③从②中将标准列插入到①中的每一个文件的工作薄中
  23. * ④对比①中第46列的数据和插入的这一列,看看每一行出现在新插入这一列的哪一行
  24. * @throws IOException
  25. * @throws InvalidFormatException
  26. */
  27. @Test
  28. public void dealXlsxS() throws IOException, InvalidFormatException{
  29. insertOneLine();
  30. readAllFile();
  31. }
  32.  
  33. /**
  34. * 将包含的点插入到每一个xlsx中
  35. * @throws InvalidFormatException
  36. * @throws IOException
  37. */
  38. public void insertOneLine() throws InvalidFormatException, IOException{
  39.  
  40. List<String> mutationIds = getList();
  41. File file1 = new File("D:/基因数据测试");
  42. File [] files = file1.listFiles();
  43.  
  44. for (int i = 0; i < files.length; i++) {
  45. FileInputStream fileInputStream = new FileInputStream(files[i]);
  46.  
  47. XSSFWorkbook workbook1 = new XSSFWorkbook(fileInputStream);
  48. Sheet sheet1 = workbook1.getSheetAt(0);
  49.  
  50. if(sheet1 != null){
  51. Row row = null;
  52. int lastRowNum = sheet1.getLastRowNum();
  53. for (int i1 = 0; i1 < 4241; i1++) {
  54. if(i1 > lastRowNum ){
  55. row = sheet1.createRow(i1);
  56. }else{
  57. row = sheet1.getRow(i1);
  58. }
  59. if(row != null){
  60. Cell cell = row.createCell(64);
  61. cell.setCellValue(mutationIds.get(i1));
  62. }
  63. }
  64. }
  65. System.out.println("插入第"+(i+1)+"个文件");
  66. FileOutputStream outPutStream = new FileOutputStream(files[i]);
  67. workbook1.write(outPutStream);
  68. outPutStream.close();
  69. workbook1.close();
  70. }
  71. }
  72.  
  73. /**
  74. * 执行对比操作
  75. * @throws IOException
  76. * @throws InvalidFormatException
  77. */
  78. public void readAllFile() throws IOException, InvalidFormatException{
  79. File file = new File("D:/基因数据测试");
  80. File [] files = file.listFiles();
  81. //获取插入的标准列
  82. List<String> mutationIds = getList();
  83. for (File file2 : files) {
  84. FileInputStream fileInputStream = new FileInputStream(file2);
  85.  
  86. XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
  87. Sheet sheet = workbook.getSheetAt(0);
  88. if(sheet != null){
  89. Row row = null;
  90. //循环每一行
  91. int maxRowNum = just4MaxRowNum(sheet);
  92. for (int i = 0; i < maxRowNum; i++) {
  93. row = sheet.getRow(i);
  94. //如果是第一行 跳过
  95. if(row.getRowNum() == 0){
  96. Cell cell = row.createCell(65);
  97. cell.setCellValue("目标行数");
  98. continue;
  99. }
  100. //获取到46列的对比列 单元格中的数据
  101. Cell cell = row.getCell(46);
  102. String cellValue = getCellValue(cell);
  103. //对数据进行截取
  104. cellValue = cellValue.substring(cellValue.indexOf("=")+1, cellValue.indexOf(";"));
  105. //将数据拆分或者放入数组中
  106. String [] cVs = null;
  107. if(cellValue.contains(",")){
  108. cVs = cellValue.split(",");
  109. }else{
  110. cVs = new String[]{cellValue};
  111. }
  112. //对比List集合中的什么位置,返回位置,如果没有,返回-1
  113. int thisNum = -1;
  114. for (int i1 = 0; i1 < cVs.length; i1++) {
  115. thisNum = mutationIds.indexOf(cVs[i1]);
  116. if(thisNum > -1){
  117. break;
  118. }
  119. }
  120.  
  121. //如果存在值,将位置值写入最后一列
  122. if(thisNum > -1){
  123. cell = row.createCell(65);
  124. cell.setCellValue(String.valueOf(thisNum+1));
  125. }
  126.  
  127. }
  128.  
  129. }
  130. FileOutputStream outPutStream = new FileOutputStream(file2);
  131. workbook.write(outPutStream);
  132. outPutStream.close();
  133. workbook.close();
  134.  
  135. }
  136. }
  137.  
  138. /**
  139. * 获取当前单元格内容
  140. * @param cell
  141. * @return
  142. */
  143. public String getCellValue(Cell cell){
  144. String cellVaule = null;
  145. switch (cell.getCellType()) {
  146. case 0: cellVaule = String.valueOf(cell.getNumericCellValue());break;
  147. case 1: cellVaule = cell.getStringCellValue();break;
  148. case 2: cellVaule = cell.getStringCellValue();break;
  149. case 3: cellVaule = null;break;
  150. case 4: cellVaule = String.valueOf(cell.getBooleanCellValue());break;
  151. case 5: cellVaule = String.valueOf(cell.getErrorCellValue());break;
  152.  
  153. default:cellVaule = null; break;
  154. }
  155.  
  156. return cellVaule.trim();
  157. }
  158.  
  159. /**
  160. * 获取到包含的点 的数据 用于插入每一个xlsx中
  161. * @return
  162. * @throws InvalidFormatException
  163. * @throws IOException
  164. */
  165. public List<String> getList() throws InvalidFormatException, IOException{
  166. File file = new File("D:/基因数据2/时代基因175精简版探针20170629定稿.xlsx");
  167. XSSFWorkbook workbook = new XSSFWorkbook(file);
  168. List<String> mutationIds = new ArrayList<String>();
  169. Sheet sheet = workbook.getSheet("包含的点");
  170. if(sheet != null){
  171. Row row = null;
  172. for (int i = 0; i < 4241; i++) {
  173. row = sheet.getRow(i);
  174. if(row != null){
  175. mutationIds.add(getCellValue(row.getCell(4)));
  176. }
  177. }
  178.  
  179. System.out.println("包含的点总共有:"+mutationIds.size());
  180. }
  181.  
  182. return mutationIds;
  183. }
  184.  
  185. /**
  186. * 获取最大行数 由于人为原因 xls中某个单元格中内容虽然已经删除 但是单元格的对象依旧创建,因此需要自己获取有效行数
  187. * @param sheet
  188. * @return
  189. */
  190. public int just4MaxRowNum(Sheet sheet){
  191. int maxRowNum = sheet.getLastRowNum();//获取最大行号 但不是有效行号
  192.  
  193. for (int i = 5; i < maxRowNum; i++) {
  194. Row row = sheet.getRow(i);
  195. Cell cell = row.getCell(46);
  196. if(cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK){//判断cell单元格为null或者单元格类型为blank就表示此单元格没有数据 那这一行的上一行就是有效行数
  197. maxRowNum = i-1;
  198. break;
  199. }
  200. }
  201. return maxRowNum;
  202. }
  203.  
  204. }

【POI】修改已存在的xls,新添一列后,再保存本文件+获取最大有效行号+获取单元格内容的更多相关文章

  1. POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取

    第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...

  2. poi 升级至4.x 的问题总结(POI Excel 单元格内容类型判断并取值)

    POI Excel 单元格内容类型判断并取值 以前用 cell.getCachedFormulaResultType() 得到 type 升级到4后获取不到了 换为:cell.getCellType( ...

  3. 使用poi导出Excel,并设定单元格内容类型,抛出异常

    本例子使用的是HSSF,为Excel2003提供处理方案. 设定为输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import o ...

  4. 1 npoi 网上 不用模板 设置密码 workbook.WriteProtectWorkbook("password", "admin"); 、、 2 locked.IsLocked = true; sheet1.ProtectSheet("password");NPOI操作EXCEL--设置密码才可以修改单元格内容 3 模板设置密码 确定原密码 设置新密码

    1 workbook.WriteProtectWorkbook("password", "admin"); 还是可以进去 只读进去 可以编辑 编辑就另存为   ...

  5. 2.6.2 用NPOI操作EXCEL--设置密码才可以修改单元格内容

    2.6.2 用NPOI操作EXCEL--设置密码       有时,我们可能需要某些单元格只读,如在做模板时,模板中的数据是不能随意让别人改的.在Excel中,可以通过“审阅->保护工作表”来完 ...

  6. WinForm------GridControl单元格内容修改外表样式

    private void gridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDra ...

  7. POI Excel 单元格内容类型判断并取值

    个人用到的 String birthdayVal = null;                                                                     ...

  8. poi 取excel单元格内容时,需要判断单元格的类型,才能正确取出

    以下内容非原创,原文链接http://blog.sina.com.cn/s/blog_4b5bc01101015iuq.html ate String getCellValue(HSSFCell ce ...

  9. 关于poi导出excel方式HSSFWorkbook(xls).XSSFWorkbook(xlsx).SXSSFWorkbook.csv的总结

    1.HSSFWorkbook(xls) import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermo ...

随机推荐

  1. bzoj 1293 贪心

    首先我们可以将这道题看成一个数轴,数轴其中的某些点存在一些颜色,我们要选取最短的一段,使这段存 在所有颜色,那么我们使用指针i,j表示在j-i位置中包含的颜色,那么初值是0,0,我们先i++,同时添加 ...

  2. 数据安全之MD5、SHA-1、CRC32区别

    crc32 — 计算一个字符串的 crc32 多项式 生成 string 参数的 32 位循环冗余校验码多项式……:这句话从英文翻译过来的,不正确,准确的说应该是这么理解: 以32位循环冗余校验多项式 ...

  3. [Leetcode Week4]H-Index

    H-Index题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/h-index/description/ Description Given an arr ...

  4. Map、Set、List初始化大小的影响

    import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Lis ...

  5. 【乱入】Uva11021麻球繁衍

    就是根据概率公式入门算算. #include<bits/stdc++.h> ; int n,m,k; double p[N],f[N]; int main(){ int T;scanf(& ...

  6. php7安装及和php5的共存

    http://blog.csdn.net/liuxinmingcode/article/details/50319145 http://www.jb51.net/article/109228.htm ...

  7. java的maven项目(三)私服的搭建(windows版)

    1       私服 nexus 安装nexus 启动服务 启动失败的解决方法: 登录nexus 用户名/密码  admin/admin123 仓库类型 Virtual   虚拟仓库 Proxy  代 ...

  8. shell字符串变量的特异功能:字符串的替换(${str/源模式/目标模式},${str//源模式/目标模式})、截断

    https://blog.csdn.net/wzb56_earl/article/details/6953612

  9. AC日记——病毒侵袭持续中 hdu 3065

    3065 思路: 好题: 代码: #include <queue> #include <cstdio> #include <cstring> using names ...

  10. POSTGRESQL 完美备份还原

    1.POSTGRESQL 完美备份还原 进入到Postgresql下的bin文件夹,会看到不少的exe文件,这就是PostgreSQL内置的工具了.里面会找到pg_dump.exe.我们实际使用的就是 ...