文档章节

jxl 操作模板,自适应高度HssfCellStyle 自适应。

BeGit
 BeGit
发布于 2017/05/26 13:42
字数 778
阅读 277
收藏 0
xls

一:HSSFCellStyle

// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中

 // 背景色
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);  
// 自动换行  这种换行的样式是这样的:


style.setWrapText(true);  

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

// 把字体 应用到当前样式
style.setFont(font);

//style设置好后,为cell设置样式
cell.setCellStyle(style)//cell为已有的单元格

二:

  在Excel处理的过程中,可能有需要用到行高自适应的时候。
  下面贴出用POI实现Excel行高自适应的代码。
  该代码可以处理一行Excel按内容自适应高度。可以处理一行内的合并单元格。
  但是该代码不支持涉及多行合并单元的计算,以后有空再补上。多行合并单元格的高度获取比较容易,但是其高度自适应就比较麻烦了。
  上代码:

/**
     * 根据行内容重新计算行高
     * @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;
    }

经过上面的方法计算,这种更符合我的需求,貌似格式也没有损坏:

© 著作权归作者所有

BeGit
粉丝 20
博文 92
码字总数 70143
作品 0
顺义
后端工程师
私信 提问
POI 导出Excel 并且根据内容设置列宽自适应

强调的是设置自适应列宽:sheet.autoSizeColumn(i);只这样设置是没有很好的效果的。所以采取了以下两步: *1. sheet.autoSizeColumn(i);//先设置自动列宽 2. sheet.setColumnWidth(i,sheet....

文文1
05/17
0
0
Java基础系列19:使用JXL或者POI生成和解析Excel文件

一 简介 如题所示,当我们需要在Java中解析Excel文件时,可以考虑使用JXL或POI的API来解析。 二者的区别如下: jxl现在基本上没被维护了,最近一次更新时间还是几年前。相反,poi属于Apache开...

pangfc
2016/12/07
0
0
jxl导入/导出Excel(Maven)

About jxl is a pure java 5 super-project that includes Enclosure, Peermi, Enshell, and Xlp. jxl && POI jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Exc......

coderzs
2017/08/31
0
0
java用org.apache.poi包操作excel

一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv...

happy圈圈
2014/05/14
0
0
JExcel 的基本操作demo

面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是...

json_wjw
2016/09/20
121
0

没有更多内容

加载失败,请刷新页面

加载更多

如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到C...

JerryWang_SAP
24分钟前
0
0
微信扫码访问网站调用默认浏览器打开如何实现?

我们在微信内分享链接或二维码的时候,我们会发现我们的网站是可以在浏览器里正常打开的,但就是不能在微信里打开,提示 “ 已停止访问该网页 ”,无论是聊天框也一样。说是系统检测到您的网...

明尼苏达哈士奇
32分钟前
1
0
一份Java程序员进阶架构师的秘籍,你离架构师还差多远

一、如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并...

我最喜欢三大框架
40分钟前
0
0
想说再见不容易,win7最新市占率依然超36%

微软正在通过努力让Windows 7用户升级至Windows 10,不过从目前的市占率来看,他们还是要加把劲了。 据最新的市场份额看,Windows 10在本月的市场份额有所提升,从43.62%增长到44.10%。另一...

linuxCool
51分钟前
4
0
SQL的优化

对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建了索引。 应尽量避...

咸鱼-李y
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部