jxl 操做模板,自適應高度HssfCellStyle 自適應。

一:HSSFCellStyle字體

// 生成一個樣式
HSSFCellStyle style = workbook.createCellStyle();
// 設置這些樣式
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中.net

 // 背景色
style.setFillForegroundColor(HSSFColor.YELLOW.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
style.setFillBackgroundColor(HSSFColor.YELLOW.index); 字符串

// 設置邊框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
// 自動換行  這種換行的樣式是這樣的:get


style.setWrapText(true);  string

// 生成一個字體
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 10);
font.setColor(HSSFColor.RED.index);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋體");it

// 把字體 應用到當前樣式
style.setFont(font);io

//style設置好後,爲cell設置樣式
cell.setCellStyle(style)//cell爲已有的單元格ast

二:class

  在Excel處理的過程當中,可能有須要用到行高自適應的時候。
  下面貼出用POI實現Excel行高自適應的代碼。
  該代碼能夠處理一行Excel按內容自適應高度。能夠處理一行內的合併單元格。
  可是該代碼不支持涉及多行合併單元的計算,之後有空再補上。多行合併單元格的高度獲取比較容易,可是其高度自適應就比較麻煩了。
  上代碼:List

/**
     * 根據行內容從新計算行高
     * @param row
     */
    public static void calcAndSetRowHeigt(HSSFRow sourceRow) {
        //原行高
        short height = sourceRow.getHeight();
        //計算後的行高
        double maxHeight = height;
        for (int cellIndex = sourceRow.getFirstCellNum(); cellIndex <= sourceRow.getPhysicalNumberOfCells(); cellIndex++) {
            HSSFCell sourceCell = sourceRow.getCell(cellIndex);
            //單元格的內容
            String cellContent = getCellContentAsString(sourceCell);
            if(null == cellContent || "".equals(cellContent)){
                continue;
            }
            //單元格的寬度
            int columnWidth = getCellWidth(sourceCell);
            System.out.println("單元格的寬度 : " + columnWidth + "    單元格的高度 : " + maxHeight + ",    單元格的內容 : " + cellContent);
            HSSFCellStyle cellStyle = sourceCell.getCellStyle();
            HSSFFont font = cellStyle.getFont(sourceRow.getSheet().getWorkbook());
            //字體的高度
            short fontHeight = font.getFontHeight();
            
            //cell內容字符串總寬度
            double cellContentWidth = cellContent.getBytes().length * 2 * 256;
            
           //字符串須要的行數 不作四捨五入之類的操做
           double stringNeedsRows =(double)cellContentWidth / columnWidth;
           //小於一行補足一行
           if(stringNeedsRows < 1.0){
               stringNeedsRows = 1.0;
           }
           
           //須要的高度             (Math.floor(stringNeedsRows) - 1) * 40 爲兩行之間空白高度
           double stringNeedsHeight = (double)fontHeight * stringNeedsRows;
           if(stringNeedsHeight > maxHeight){
               maxHeight = stringNeedsHeight;
           }
           System.out.println("字體高度 : " + fontHeight + ",    字符串寬度 : " + cellContentWidth + ",    字符串須要的行數 : " + stringNeedsRows + ",   須要的高度 : " + stringNeedsHeight);
           System.out.println();
        }
        //超過原行高三倍 則爲3倍 實際應用中可
        if(maxHeight/height > 5){
            maxHeight = 5 * height;
        }
        //最後取天花板防止高度不夠
        maxHeight = Math.ceil(maxHeight);
        sourceRow.setHeight((short)maxHeight);
    }
    
    /**
     * 解析一個單元格獲得數據
     * @param columnNameList
     * @param row
     * @param ext2
     * @param ext1
     * @return
     */
    private static String getCellContentAsString(HSSFCell cell) {
        if(null == cell){
            return "";
        }
        String result = "";
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_NUMERIC:
            String s = String.valueOf(cell.getNumericCellValue());
            if (s != null) {
                if (s.endsWith(".0")) {
                    s = s.substring(0, s.length() - 2);
                }
            }
            result = s;
            break;
        case Cell.CELL_TYPE_STRING:
            result = ToolKits.nulltoempty(String.valueOf(cell.getStringCellValue())).trim();
            break;
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            result = String.valueOf(cell.getBooleanCellValue());
            break;
        case Cell.CELL_TYPE_ERROR:
            break;
        default:
            break;
        }
        return result;
    }
    
    /**
    * 獲取單元格及合併單元格的寬度
    * @param sheet
    * @param row
    * @param column
    * @return
    */
    private static int getCellWidth(HSSFCell cell) {
        int result = 0;
        HSSFSheet sheet = cell.getSheet();
        int rowIndex = cell.getRowIndex();
        int columnIndex = cell.getColumnIndex();
        
        boolean isPartOfRegion = false;
        int firstColumn = 0;
        int lastColumn = 0;
        int firstRow = 0;
        int lastRow = 0;
        int sheetMergeCount = sheet.getNumMergedRegions();
        for (int i = 0; i < sheetMergeCount; i++) {
            Region ca = sheet.getMergedRegionAt(i);
            firstColumn = ca.getColumnFrom();
            lastColumn = ca.getColumnTo();
            firstRow = ca.getRowFrom();
            lastRow = ca.getRowTo();
            if (rowIndex >= firstRow && rowIndex <= lastRow) {
                if (columnIndex >= firstColumn && columnIndex <= lastColumn) {
                    isPartOfRegion = true;
                    break;
                }
            }
        }
        if(isPartOfRegion){
            for (int i = firstColumn; i <= lastColumn; i++) {
                result += sheet.getColumnWidth(i);
            }
        }else{
            result = sheet.getColumnWidth(columnIndex);
        }
        return result;
    }

通過上面的方法計算,這種更符合個人需求,貌似格式也沒有損壞:

相關文章
相關標籤/搜索