精华内容
下载资源
问答
  • POI设置单元格自动行高的思路

    千次阅读 2019-11-27 22:38:32
    在经过Jxls或者POI导出数据至excel中后,发现有的单元格内容太多,既没有自动换行,也没有自动增大行高。那如何通过Java代码来实现呢?请看下面步骤: (一)首先,将excel设置为最合适的行高,通过CTRow对象的...

    在经过Jxls或者POI导出数据至excel中后,发现有的单元格内容太多,既没有自动换行,也没有自动增大行高。那如何通过Java代码来实现呢?请看下面步骤:

    (一)首先,将excel设置为最合适的行高,通过CTRow对象的setCustomHeight(false)函数实现,具体的代码如下:

    XSSFWorkbook workbook = new XSSFWorkbook(文件路径或者文件流);

    XSSFSheet sheet = workbook.getSheet(sheetIndex);

    XSSFRow xssfRow = sheet.getRow(rowIndex);

    CTRow ctRow = xssfRow.getCTRow();

    ctRow.setCustomHeight(false);

    (二)然后,循环每个sheet页的行,通过XSSFCell的setWrapText(true),就可以设置单元格自动换行,并且自动调整行高,将单元格内容全部显示出来;

    (三)最后,对于合并的单元格,只能是通过XSSFRow的setHeight(行高值)来设置,这里说一下思路:

       (1)通过sheet获取当前sheet页总共有哪些合并的单元格,例如List<CellRangeAddress> listCombineCell = sheet.getMergedRegions();

       (2)计算合并单于格的高度和宽度,采用循环的方式求的每一行的高度之和或者是每一列的宽度之和;

       (3)获取合并单元格的内容,首先统计中文字符的个数,然后使用String的getByte().length获取字节数,加上中文字符的个数,最后将这两者之和乘以256(为何要乘以256,可以看POI中获取列宽的源码,在里面除以列256),这样得到了内容的长度;

       (4)若内容的长度小于合并单元格的宽度,就不需要进行行高设置了;若内容的长度大于合并单元格的宽度,那么通过合并单元格的宽度除以内容的长度,计算内容需要多少行才能全部显示出来,这里采用取比商大的最小整数,考虑到单元格有padding和margin距离,最好是再加上一行量;这里需要注意如何计算单元格中内容的宽度了,首先将字符串形式的内容按换行符转换成字符数组,接着计算字符数组中每一个元素的宽度,将它们的宽带和单元格实际宽度相除,这样就可以统计字符数组每个元素需要多少行来显示,最终将这些行数累加起来,最后还加上字符数组大小值,这样就得到了单元格内容需要的行数。

       (5)计算合并单元格字体的高度,然后乘以内容需要的行数(第4步中求得的行数),得到内容需要的总高度;

       (6)判断合并单元格是否是行合并(通过起始行号和终止行号是否相等来判断,若相等就不是行合并,否则就是行合并),若是行合并的情况,那么就需要计算是由多少行合并的(终止行号减去起始行号,再加一),接着计算每一行需要的平均高度(单元格内容的总高度除以行合并的单元格的行数),然后通过循环设置行合并的单元格区域的每一行所需要的平均高度。若不是行合并的单元格,那么直接将行高设置为单元格内容所需的总高度即可。

     (四)备注:若不想对所有导出数据的样式做修改,那么可以这样设置好模板,在需要修改行高的单元格中设置自定换行的属性,这样可以避免修改不需要调整样式的单元格。

    展开全文
  • Java 设置Excel自适应行高、列宽

    千次阅读 2020-02-11 11:17:02
    在excel中,可通过设置自适应行高或列宽自动排版,是一种比较常用的快速调整表格整体布局的方法。设置自适应时,可考虑2种情况: 1.固定数据,设置行高、列宽自适应数据(常见的设置自适应方法) 2.固定列宽,...
    在excel中,可通过设置自适应行高或列宽自动排版,是一种比较常用的快速调整表格整体布局的方法。设置自适应时,可考虑2种情况:
    1.固定数据,设置行高、列宽自适应数据(常见的设置自适应方法)
    2.固定列宽,缩小数据字体大小适应列宽
    本文将通过java程序来介绍具体的自适应设置方法。
    
    工具:Free Spire.XLS for Java (免费版)
    :可通过官网下载包,并解压将lib文件夹下的jar文件导入java程序;或者通过maven仓库下载并导入。
    参考如下导入效果:


    Java 代码示例

    1. 固定数据,设置行高、列宽自适应数据
    (此自适应方法可对指定单元格数据或者整个工作表来设置)
    import com.spire.xls.*;
    
    public class AutoFit {
        public static void main(String[] args) {
            //创建一个Workbook类的对象,并加载测试文档
            Workbook wb = new Workbook();
            wb.loadFromFile("sample.xlsx");
    
            //获取工作表
            Worksheet sheet = wb.getWorksheets().get(0);
    
            //设置行高、列宽为自适应(应用于指定数据范围)
            sheet.getAllocatedRange().get("A1:E14").autoFitRows();
            sheet.getAllocatedRange().get("A1:E14").autoFitColumns();
    
            /*//设置行高、列宽为自适应(应用于整个工作表)
            sheet.getAllocatedRange().autoFitRows();
            sheet.getAllocatedRange().autoFitColumns();*/
    
            //保存文档
            wb.saveToFile("result.xlsx", FileFormat.Version2010);
            wb.dispose();
        }
    }
    
    自适应设置效果:

     

    2. 缩小数据字体大小适应列宽

    import com.spire.xls.*;
    
    public class ShrinkToFit {
        public static void main(String[] args) {
            Workbook wb = new Workbook();
            wb.loadFromFile("test.xlsx");
            //获取第一张工作表
            Worksheet sheet = wb.getWorksheets().get(0);
    
            //指定需要自动缩小字体的单元格范围
            CellRange cell = (CellRange) sheet.get("A1");
    
            //设置ShrinkToFit为true,缩小数据以适应单元格
            cell.getStyle().setShrinkToFit(true);
    
            //保存文档
            wb.saveToFile("ShrinkTextToFitCell.xlsx", ExcelVersion.Version2013);
            wb.dispose();
        }
    }
    

    文本缩小效果:

     

    (本文完)

    展开全文
  • POI java导出Excel设置自适应行高

    千次阅读 2020-11-18 11:54:12
    需求:根据单元格的内容自动设置行高 代码: /** * 设置自适应行高的方法 */ public int setHeight(HSSFRow row, int cellIndex){ HSSFCell cell = row.getCell(cellIndex); //1.先取出内容 计算长度 (这...

    本文章参考于:https://www.cnblogs.com/dtts/p/4741575.html 

    需求:根据单元格的内容自动设置行高

    代码:

      /**
         * 设置自适应行高的方法
         */
        public int setHeight(HSSFRow row, int cellIndex){
            HSSFCell cell = row.getCell(cellIndex);
            //1.先取出内容 计算长度 (这个方法在后面...)
            String content = getCellContent(cell);
            System.out.println("我想看看取出的内容对不对"+content);
            //计算字体的高度
            HSSFCellStyle cellStyle = cell.getCellStyle();
            HSSFFont font = cellStyle.getFont(row.getSheet().getWorkbook());
            //字体的高度
            short fontHeight = font.getFontHeight();
            System.out.println("我这里输出的是11号的字体的高度,貌似要除以20才是Excel的"+fontHeight);//11号字体的高度  这里不重要(本方法也用不着)  这里设置每一行都是18磅
            //计算字符的宽度
            //代入默认字符宽度8://字符像素宽度 = 字体宽度 * 字符个数 + 边距
            //像素 = 5 + (字符个数 * 7)
            int i = 5 + (content.toCharArray().length * 7);
            //POI中的字符宽度算法是:double 宽度 = (字符个数 * (字符宽度 - 1) + 5) / (字符宽度 - 1) * 256;
            double poiWidth = content.length() * 12 / 7 * 256;
            //然后再四舍五入成整数。
            int width = (int) Math.ceil(poiWidth);
            System.out.println("我这里计算的是字符串长度的宽度"+width);
            //2.除以宽度 计算行数乘以行高   (256*80) 是我设置的我的单元格列的宽度
            double rowNum = (double) width/(256*80);
            System.out.println("我是计算出来的行数"+rowNum);
            int rowNums = (int)Math.ceil(rowNum);
            System.out.println("在这里计算的是多少行,我想知道算对了没"+rowNums);
            int height = rowNums* 420;//这个420 是我为每一行设置的高度 有点大,可以用字体的高度加一点(前面方法中有计算字体高度的方法)
            return height;//直接设置行高为这个值就OK了
        }
    private static String getCellContent(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 = 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;
    }
    展开全文
  • Java POI Excel 行高自适应

    千次阅读 2014-03-28 14:08:04
    在Excel处理的过程中,可能有需要用到行高自适应的时候。 下面贴出用POI实现Excel行高自适应的代码。...java"] /** * 根据行内容重新计算行高 * @param row */ public static void calcAndSe...
    在Excel处理的过程中,可能有需要用到行高自适应的时候。
    

    下面贴出用POI实现Excel行高自适应的代码。

    该代码可以处理一行Excel按内容自适应高度。可以处理合并单元格。

    上代码:

    /**
    * 根据行内容重新计算行高
    * @param row
    */
    public static void calcAndSetRowHeigt(HSSFRow sourceRow) {
    for (int cellIndex = sourceRow.getFirstCellNum(); cellIndex <= sourceRow.getPhysicalNumberOfCells(); cellIndex++) {
    //行高
    double maxHeight = sourceRow.getHeight();
    HSSFCell sourceCell = sourceRow.getCell(cellIndex);
    //单元格的内容
    String cellContent = getCellContentAsString(sourceCell);
    if(null == cellContent || "".equals(cellContent)){
    continue;
    }
    //单元格的宽高及单元格信息
    Map<String, Object> cellInfoMap = getCellInfo(sourceCell);
    Integer cellWidth = (Integer)cellInfoMap.get("width");
    Integer cellHeight = (Integer)cellInfoMap.get("height");
    if(cellHeight > maxHeight){
    maxHeight = cellHeight;
    }
    System.out.println("单元格的宽度 : " + cellWidth + " 单元格的高度 : " + 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 / cellWidth;
    //小于一行补足一行
    if(stringNeedsRows < 1.0){
    stringNeedsRows = 1.0;
    }

    //需要的高度 (Math.floor(stringNeedsRows) - 1) * 40 为两行之间空白高度
    double stringNeedsHeight = (double)fontHeight * stringNeedsRows;
    //需要重设行高
    if(stringNeedsHeight > maxHeight){
    maxHeight = stringNeedsHeight;
    //超过原行高三倍 则为5倍 实际应用中可做参数配置
    if(maxHeight/cellHeight > 5){
    maxHeight = 5 * cellHeight;
    }
    //最后取天花板防止高度不够
    maxHeight = Math.ceil(maxHeight);
    //重新设置行高 同时处理多行合并单元格的情况
    Boolean isPartOfRowsRegion = (Boolean)cellInfoMap.get("isPartOfRowsRegion");
    if(isPartOfRowsRegion){
    Integer firstRow = (Integer)cellInfoMap.get("firstRow");
    Integer lastRow = (Integer)cellInfoMap.get("lastRow");
    //平均每行需要增加的行高
    double addHeight = (maxHeight - cellHeight)/(lastRow - firstRow + 1);
    for (int i = firstRow; i <= lastRow; i++) {
    double rowsRegionHeight =sourceRow.getSheet().getRow(i).getHeight() + addHeight;
    sourceRow.getSheet().getRow(i).setHeight((short)rowsRegionHeight);
    }
    }else{
    sourceRow.setHeight((short)maxHeight);
    }
    }
    System.out.println("字体高度 : " + fontHeight + ", 字符串宽度 : " + cellContentWidth + ", 字符串需要的行数 : " + stringNeedsRows + ", 需要的高度 : " + stringNeedsHeight + ", 现在的行高 : " + maxHeight);
    System.out.println();
    }
    }

    /**
    * 解析一个单元格得到数据
    * @param cell
    * @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 cell
    * @return
    */
    private static Map<String, Object> getCellInfo(HSSFCell cell) {
    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;
    }
    }
    }
    Map<String, Object> map = new HashMap<String, Object>();
    Integer width = 0;
    Integer height = 0;
    boolean isPartOfRowsRegion = false;
    if(isPartOfRegion){
    for (int i = firstColumn; i <= lastColumn; i++) {
    width += sheet.getColumnWidth(i);
    }
    for (int i = firstRow; i <= lastRow; i++) {
    height += sheet.getRow(i).getHeight();
    }
    if(lastRow > firstRow){
    isPartOfRowsRegion = true;
    }
    }else{
    width = sheet.getColumnWidth(columnIndex);
    height += cell.getRow().getHeight();
    }
    map.put("isPartOfRowsRegion", isPartOfRowsRegion);
    map.put("firstRow", firstRow);
    map.put("lastRow", lastRow);
    map.put("width", width);
    map.put("height", height);
    return map;
    }
    展开全文
  • jxl实现自动化列宽和行高

    千次阅读 2017-03-06 12:44:38
    一、实现自动行高:sheet.setRowView(i, true);//设置自动行高(i为行号)二、实现自动化列宽CellView cellView = new CellView(); cellView.setAutoSize(true); sheet.setColumnView(i,cellView);注:当单元格内容...
  • 再向POI导出的表格中填出数据时,由于数据过多,一行显示不全数据,这时候想自动调整行高 ?怎么办?或者说怎么让数据显示完全?
  • 代码才重要,如下。 public static void calcAndSetRowHeigt(HSSFRow sourceRow) throws Exception { for (int cellIndex = sourceRow.getFirstCellNum(); cellIndex <... //行高 double m.
  • 在excel中,可通过设置自适应行高或列宽自动排版,是一种比较常用的快速调整表格整体布局的方法。设置自适应时,可考虑2种情况:固定数据,设置行高、列宽自适应数据(常见的设置自适应方法)固定列宽,缩小数据字体...
  • poi 获取自动换行后行高

    千次阅读 2019-08-27 22:43:34
    * 根据行内容重新计算行高 * @param row */ public static void calcAndSetRowHeigt(HSSFRow sourceRow) { for (int cellIndex = sourceRow.getFirstCellNum(); cellIndex <= sourceRow.getPhys...
  • 在经过Jxls或者POI导出数据至excel中后,发现有的单元格内容太多,既没有自动换行,也没有自动增大行高。那如何通过Java代码来实现呢?请看下面步骤: (一)首先,将excel设置为最合适的行高,通过CTRow对象的...
  • DataGrid自动调整行高

    千次阅读 2012-04-12 19:00:35
    这是Alex Harui写的一个关于自定义的基于流式的renderer使用演示。  首先,它在左上角画了一个正方形,然后设置显示文本在右侧。每一行的文本值都都不一样,有多的,也有少的。  这个例子使用了数据绑定来设置 ...
  • POI EXCEL 模板 自动调整行高

    千次阅读 2012-01-15 20:06:41
    package com.testritegroup.datahub.print.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; ...
  • 本文主要讲解了POI中的表格行高列宽比例,以及根据这个不同的场景生成,如标题,说明,字段头。主要是思路给大家参考,完整代码可能需要你们微调,生成表格如下(代码在最后) 目录 摘要 比例讲解 行高 列宽 ...
  • 如果图片宽度或高度大于表单域,将自动按比例缩放到合适大小。 addHtml(String templKey,String key,String htmlStr),向模板中一个表单域添加一段html代码, Html代码将被解析成实际显示内容添加到表单域中。注:...
  • Excel VBA脚本自动适配行高度

    千次阅读 2020-04-27 15:51:17
    第7行中A1列有一个标记点'.' 下图为最终效果, 可以看到从第六行到第七行都可以根据单元格内容动态改变行高。(打开excel后需要点击一下允许执行宏) Alt + F11查看Vba脚本 也可以去我的github上查看整套代码: ...
  • swing jtextarea 自动行高

    2013-01-07 14:17:24
    哈哈哈.... final JTextArea textArea = new JTextArea(); textArea.setFont(new Font("Meiryo", Font.BOLD, 18));... textArea.setWrapStyleWord(true);... textArea.addKeyLis...
  • 在生成excel文件的时候,使用list填充表格内容,但是,出现了内容行高不一致的问题,出现的问题如下图所示 第一行是填充模板设置的行高(35),第二,第三行是自动生成的行高(35.1),没办法改变,第四行到下边的...
  • poi 3.17 设置行高失效

    千次阅读 2019-01-07 16:40:00
    BUG描述:设置行高后运行成功,继续对其他行进行行高设置后,所有行高设置失效;对数据进行插入行操作后,所有行高设置失效 解决方法: 先插入数据到sheet表,并获取所插入的行数,遍历集合数据从所获取的行数...
  • //设置自动换行 style.setWrapText(true); return style; } /** * 字体样式 * @param size 字体大小 * @param isBold 是否加粗 * @return */ private Font getFont(Workbook workbook, short size, boolean isBold)...
  • 目录EasyPOI 根据模板导出excel时,无法自适应行高得解决方案记录首先说一下问题得场景第一步第二步第三步第四步第五步第六步第七步 (就是这个方法!) EasyPOI 根据模板导出excel时,无法自适应行高得解决方案记录...
  • npoi自适应行高和列宽

    千次阅读 2016-07-22 18:37:25
     首先要设置该列能够自动换行,然后将行高设置为20,获得列内容宽度后整除一个列宽常数,将其倍数乘以行高,从而增加行高。值得注意的是这个常数需要自己 测试,因为实际内容都是英文、数字和汉字混杂的,很难判断...
  • 给GridView设置行高

    千次阅读 2014-10-15 14:58:33
    最近在工作中遇到了这样一个问题,使用一个GridView展示数据,item中只是一个TextView,但是里面显示的文字多少不固定多少,必须全部展示出来. ...没有一个属性可以给GridView设置行高,那么高度就不能控制. 遇到的问题展
  • excel合并的单元格自动换行自动调高
  • * 通过此方法来计算行高,需要在config中调用配置数据的API * * @param indexPath 必传,对应的indexPath * @param confi 必须要实现,且需要调用配置数据的API * * @return 计算的行高 */ + (CGFloat)hyb_...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    前端面试题汇总 ... 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? 21 ... 21 Quirks模式是什么?它和Standards模式有什么区别 21 div+css的布局较table布局有什么优点?...img的alt与title有何异同?...
  • ????推荐大家关注一个公众号????点击上方 "编程技术圈"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!每日英文There are plenty of things in lif...
  • // 自动调整行高 public static float getExcelCellAutoHeight(String str, float defaultRowHeight, int fontCountInline) { int defaultCount = 0; for (int i = 0; i < str.length(); i++) { int ff ...
  • 关于Aspose Words 保存后行高自动加10pt或8pt 原贴地址:需要梯子 https://forum.aspose.com/t/wrong-spaceafter-while-reading-and-saving/204617 该问题是软件版本造成的问题,低版本(低于19.11)的Aspose Words...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,273
精华内容 2,109
关键字:

java自动行高

java 订阅