poi合併單元格的處理
1、獲取真實的單元格行數
2、判斷是否有合併行
package util; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.poi.hslf.model.Sheet; 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.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.controller.GraphController; import com.entity.Tree; public class EBom { //EBom格式的匯入 /** * 讀取excel檔案 * * @param wb * @param sheetIndex sheet頁下標:從0開始 * @param startReadLine 開始讀取的行:從0開始 * @param tailLine 去除最後讀取的行 * @throws IOException * @throws InvalidFormatException *///String pid, File filepath, Tree root public static Tree getHSSFSheet(String pid, File filepath, Tree root) throws Exception { root=new Tree(); HSSFWorkbook workbook = new HSSFWorkbook(FileUtils.openInputStream(filepath)); //讀取預設的第一個工作表sheet HSSFSheet Hsheet = workbook.getSheetAt(0); //獲取sheet中最後一行行號 int lastRowNum = Hsheet.getLastRowNum(); int realRowNum=0; for(int i=1;i<lastRowNum;i++){ HSSFRow currentRow=Hsheet.getRow(i); int count=0; if(currentRow==null){ realRowNum=i; break; }else{ for(int j=0;j<=currentRow.getLastCellNum();j++){ if(currentRow.getCell(j)!=null){ if(currentRow.getCell(j).getStringCellValue()!=null&&!currentRow.getCell(j).getStringCellValue().isEmpty()){ break; }else{ count++; } } } if(count==currentRow.getLastCellNum()){ realRowNum=i-1; break; } } } //給root複製 root.setId(pid); root.setPid(""); root.setLevel(1); HashMap<String, List<Integer>> map=new HashMap<String, List<Integer>>(); int node=0; int pNode=1; List<Tree> list=new ArrayList<>(); list.add(root); for(int i=2;i < realRowNum; i++){ HSSFRow row = Hsheet.getRow(i); //暫時給定11個單位的長度 String value[]=new String[row.getLastCellNum()+1]; String cValue[]=new String[11]; String pName; Tree tree=new Tree(); boolean isMerge = isMergedRegion(Hsheet, i, 0); //判斷是否具有合併單元格 if (isMerge) { pName = getMergedRegionValue(Hsheet, i, 0); } else { pName=SysUtil.toNumeric(Hsheet, i, 0); } for(int j=1;j<row.getLastCellNum();j++){ value[j]=SysUtil.toNumeric(Hsheet, i, j); } //給value重新賦值 cValue[0]=value[3]; cValue[3]=value[1]; cValue[4]=value[2]; cValue[2]=value[4]; cValue[5]=value[5]; cValue[7]=value[6]; cValue[8]=value[7]; tree.setValue(cValue); if(map.get(pName)==null){ //第二層級 String[] pValue=new String[11]; pValue[0]=pName; Tree p=new Tree(); p.setLevel(2); p.setNode(pNode); p.setValue(pValue); p.setBg_color("#9BBACF"); p.setType("ass"); pNode++; list.add(p); List<Integer> v=new ArrayList<Integer>(); node=1; v.add(node); map.put(pName,v); }else{ List<Integer> v=map.get(pName); v.add(node++); map.put(pName, v); } tree.setBg_color("#D7DBDE"); tree.setType("part"); tree.setLevel(3); tree.setNode(node); tree.setValue(cValue); list.add(tree); } setValue(list); GraphController.merge(root,list); //將list集合轉換成tree結構 return root; } public static Tree getXSSFSheet(String pid, File filepath, Tree root) throws Exception { root=new Tree(); XSSFWorkbook workbook = new XSSFWorkbook(FileUtils.openInputStream(filepath)); //讀取預設的第一個工作表sheet XSSFSheet Xsheet = workbook.getSheetAt(0); //獲取sheet中最後一行行號 int lastRowNum = Xsheet.getLastRowNum(); int realRowNum=0; for(int i=1;i<lastRowNum;i++){ XSSFRow currentRow=Xsheet.getRow(i); int count=0; if(currentRow==null){ realRowNum=i; break; }else{ for(int j=0;j<=currentRow.getLastCellNum();j++){ if(currentRow.getCell(j)!=null){ if(currentRow.getCell(j).getStringCellValue()!=null&&!currentRow.getCell(j).getStringCellValue().isEmpty()){ break; }else{ count++; } } } if(count==currentRow.getLastCellNum()){ realRowNum=i-1; break; } } } //給root複製 System.out.println(pid); root.setId(pid); root.setPid(""); root.setLevel(1); System.out.println("真實行:"+realRowNum); HashMap<String, List<Integer>> map=new HashMap<String, List<Integer>>(); int node=0; int pNode=1; List<Tree> list=new ArrayList<>(); list.add(root); for(int i=2;i < realRowNum; i++){ XSSFRow row = Xsheet.getRow(i); //暫時給定11個單位的長度 String value[]=new String[row.getLastCellNum()+1]; String cValue[]=new String[11]; String pName; Tree tree=new Tree(); boolean isMerge = isMergedRegion(Xsheet, i, 0); //判斷是否具有合併單元格 if (isMerge) { pName = getMergedRegionValue(Xsheet, i, 0); System.out.print(pName + " :"); } else { pName=SysUtil.XssfToNumeric(Xsheet, i, 0); System.out.print(SysUtil.XssfToNumeric(Xsheet, i, 0) + " "); } for(int j=1;j<row.getLastCellNum();j++){ value[j]=SysUtil.XssfToNumeric(Xsheet, i, j); System.out.print(SysUtil.XssfToNumeric(Xsheet, i,j) + " "); } System.out.println(); //給value重新賦值 cValue[0]=value[3]; cValue[3]=value[1]; cValue[4]=value[2]; cValue[2]=value[4]; cValue[5]=value[5]; cValue[7]=value[6]; cValue[8]=value[7]; tree.setValue(cValue); if(map.get(pName)==null){ //第二層級 String[] pValue=new String[11]; pValue[0]=pName; Tree p=new Tree(); p.setLevel(2); p.setNode(pNode); p.setValue(pValue); p.setBg_color("#9BBACF"); p.setType("ass"); pNode++; list.add(p); List<Integer> v=new ArrayList<Integer>(); node=1; v.add(node); map.put(pName,v); }else{ List<Integer> v=map.get(pName); v.add(node++); map.put(pName, v); } tree.setBg_color("#D7DBDE"); tree.setLevel(3); tree.setNode(node); tree.setValue(cValue); tree.setType("part"); list.add(tree); } setValue(list); GraphController.merge(root,list); //將list集合轉換成tree結構 System.out.println(root); return root; } /** * 獲取合併單元格的值 * * @param sheet * @param row * @param column * @return */ public static String getMergedRegionValue(HSSFSheet sheet, int row, int column) { int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress ca = ((org.apache.poi.ss.usermodel.Sheet) sheet).getMergedRegion(i); int firstColumn = ca.getFirstColumn(); int lastColumn = ca.getLastColumn(); int firstRow = ca.getFirstRow(); int lastRow = ca.getLastRow(); if (row >= firstRow && row <= lastRow) { if (column >= firstColumn && column <= lastColumn) { Row fRow = ((org.apache.poi.ss.usermodel.Sheet) sheet).getRow(firstRow); Cell fCell = fRow.getCell(firstColumn); return getCellValue(fCell); } } } return null; } /** * 獲取合併單元格的值 * * @param sheet * @param row * @param column * @return */ public static String getMergedRegionValue(XSSFSheet sheet, int row, int column) { int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress ca = ((org.apache.poi.ss.usermodel.Sheet) sheet).getMergedRegion(i); int firstColumn = ca.getFirstColumn(); int lastColumn = ca.getLastColumn(); int firstRow = ca.getFirstRow(); int lastRow = ca.getLastRow(); if (row >= firstRow && row <= lastRow) { if (column >= firstColumn && column <= lastColumn) { Row fRow = ((org.apache.poi.ss.usermodel.Sheet) sheet).getRow(firstRow); Cell fCell = fRow.getCell(firstColumn); return getCellValue(fCell); } } } return null; } /** * 判斷合併了行 * * @param sheet * @param row * @param column * @return */ private boolean isMergedRow(Sheet sheet, int row, int column) { int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress range = ((org.apache.poi.ss.usermodel.Sheet) sheet).getMergedRegion(i); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); if (row == firstRow && row == lastRow) { if (column >= firstColumn && column <= lastColumn) { return true; } } } return false; } /** * 判斷指定的單元格是否是合併單元格 * * @param sheet * @param row 行下標 * @param column 列下標 * @return */ private static boolean isMergedRegion(HSSFSheet sheet, int row, int column) { int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress range = ((org.apache.poi.ss.usermodel.Sheet) sheet).getMergedRegion(i); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); if (row >= firstRow && row <= lastRow) { if (column >= firstColumn && column <= lastColumn) { return true; } } } return false; } private static boolean isMergedRegion(XSSFSheet sheet, int row, int column) { int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress range = ((org.apache.poi.ss.usermodel.Sheet) sheet).getMergedRegion(i); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); if (row >= firstRow && row <= lastRow) { if (column >= firstColumn && column <= lastColumn) { return true; } } } return false; } /** * 獲取單元格的值 * * @param cell * @return */ public static String getCellValue(Cell cell) { if (cell == null) return ""; if (cell.getCellType() == Cell.CELL_TYPE_STRING) { return cell.getStringCellValue(); } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()); } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { return cell.getCellFormula(); } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { return String.valueOf(cell.getNumericCellValue()); } return ""; } public static void main(String [] arg) throws Exception{ File filepath=new File("d:/upload","EBOM.xls"); Tree tree = new Tree(); String pid="root"; getHSSFSheet(pid,filepath,tree); } //賦值,id,pid public static void setValue(List<Tree>list){ for(int i=1;i<list.size();i++){ if(list.get(i).getLevel()>list.get(i-1).getLevel()){ list.get(i).setPid(list.get(i-1).getId()); list.get(i).setId(list.get(i-1).getId()+"_"+list.get(i).getNode()); }else if(list.get(i).getLevel()<list.get(i-1).getLevel()){ list.get(i).setPid(list.get(0).getId()); list.get(i).setId(list.get(0).getId()+"_"+list.get(i).getNode()); }else{ list.get(i).setPid(list.get(i-1).getPid()); list.get(i).setId(list.get(i).getPid()+"_"+list.get(i).getNode()); } } } }
2、判斷是否是合併單元格
相關推薦
POI:單元格處理(對齊方式、邊框、填充色、合併)
public static void main(String[] args) throws Exception{ Workbook wb=new HSSFWorkbook(); // 定義一個新的工作簿 Sheet sheet=wb.crea
poi合併單元格的處理
1、獲取真實的單元格行數 2、判斷是否有合併行 package util; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Has
java poi 合併單元格
java poi 合併單元格 2017年03月29日 16:39:01 翠煙你懊惱 閱讀數:26561 poi 合併 單元格
POI合併單元格時CellRangeAddress類提示過時之解決
最近筆者使用POI做報表匯出,在涉及合併單元格時,IDE提示CellRangeAddress這個類已經過時了,雖然不影響使用,但是具有“強迫症”的筆者,還是想找到最新的類來實現功能。 百度搜索這個問題,帖子並不是很多,大多也只是介紹如何這個類來合併單元格的,偶爾有提到過時的,下面卻沒有解決的留言
poi合併單元格
直接上可執行程式碼package com.cqliving.cloud.common;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkboo
POI合併單元格邊框顯示問題,笨方法解決。如有更好的方法,歡迎留言,求指教告知
網上找了好多關於POI合併單元格的文章,無奈智商捉雞,玩不出來,最後弄了個最麻煩的 //匯出excel,含有合併單元格 @Testpublic void exoprtExc_MergedRegion() {String realpath = PoiTemplate.cla
Apache POI 合併單元格
合併單元格所使用的方法: sheet.addMergedRegion( CellRangeAddress cellRangeAddress ); CellRangeAddress 物件的構造方法需要傳入合併單元格的首行、最後一行、首列、最後一列。 C
QT MVC 中合併單元格處理
QT中使用QTableView/QTableModel時合併單元格的處理 擴充套件 QTableModel/QAbstractItemModel 在單元格屬性中儲存合併資訊,我使用Qt::UserRole屬性,使用QPoint儲存合併的範圍。 擴充套件 QTableView
Java poi 根據業務合併單元格
Java poi操作Excel 是比較常用的,通常我們用來匯出Excel格式的文字資料。比如說兩個表,一個是入庫明細,一個是結算明細。針對每一條的入庫明細可能有對於的幾條的結算明細資訊,結算明細中有id關
Excel轉Html(八)--POI-解析獲取合併單元格-按照X-Y座標解析-與handsontable資料展示/儲存一致
public static List<DmFormMergedDto> getMergedCells(Sheet sheet, int rowIndex, int cellIndex, Long formId) { &nbs
Java-poi匯入excel合併單元格
要匯入的excel示例 一、Action @Action("/import-excel") public void toimport() { String root = ServletActionContext.getSer
poi excel設定合併單元格邊框格式
版本3.17 //設定合併單元格的邊框 public static void setBorderForMergeCell(BorderStyle style,int color, CellRangeAddress cra,Sheet sheet){ RegionUtil.se
POI操作Excel文件、讀取、寫入、合併單元格
一、POI專案簡介 POI全稱 Poor Obfuscation Implementation,利用POI介面可以通過JAVA操作Microsoft office 套件工具的讀寫功能。官網:http:/
POI 匯出Excel實現合併單元格以及列自適應寬度
目錄 參考推薦: POI 匯出Excel 1. 合併單元格 POI是apache提供的一個讀寫Excel文件的開源元件,在操作excel時常要合併單元格,合併單元格的方法是: public CellRang
POI匯出Excel設定單元格格式2--建立與設定Excel合併單元格
POI建立與設定Excel合併單元格 話不多說上栗子 //準備工作 XSSFWorkbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet("sheet1"); XSSFCreationHelper creationHel
java poi 讀取有合併單元格的EXCEL檔案
資料的樣子是這樣的 public String addReportByExcel(Long userId,InputStream inputStream,String fileName) throws BusinessException{ String mes
poi匯出資料(需要合併單元格)
import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.Invocation
[轉] POI SAX 解析 xlsx 包括空單元格處理
1.原文傳送門 2.說明 最近有關於大資料量 Excel07 的解析, 網上搜索了N篇文章, 都不能完美解決空單元格的問題, 直到發現上文, 剛好滿足需要 3.原理 poi先將excel轉為xml,而後是使用SAXParser解析器,解析x
Apache POI如何獲取Excel合併單元格的值
/** * 獲取合併單元格的值 * @param sheet * @param row * @param column * @return */ public String getMergedRegionValue(Sheet sheet ,in
POI匯出Excel--合併單元格
package com.test.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io