1. 程式人生 > >poi合併單元格的處理

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