精华内容
下载资源
问答
  •  目的是要将Excel中的文字全部显示出来,可以设置对齐格式为【缩小字体填充】,但是这样的话只能展示出一行数据,字体会变得很小。还有一种办法,设置对齐格式为【自动换行】,然后单元格中的字体自动调整大小。 ...

    问题

      目的是要将Excel中的文字全部显示出来,可以设置对齐格式为【缩小字体填充】,但是这样的话只能展示出一行数据,字体会变得很小。还有一种办法,设置对齐格式为【自动换行】,然后让单元格中的字体自动调整大小。

      我的实现思路是,设置单元格中的字体大小,最大10号字,最小5号字,判断优先使用大的字体;如果最小的5号字也放不下,那就只能调整模板了。关键点就是判断当前字号能否将内容完全展示在单元格中。

      需要提前说明一点,我的这个方法是不精确的算法,excel设置字体的时候太强大了,不同的字体的字间距、行间距都会不同。

     

    关键点

      判断字体大小是否合理的思路:

      1、计算出单元格的总宽度、总高度
      2、计算出其中的内容的总长度,不同的字号,长度是不同的
      3、内容总长度除以单元格宽度,得出实际上一共有多少行数据 x
      4、单元格的总高度除以内字体的高度,得出能展示出来的数据有多少行 y
      5、如果 y>=x ,那么表示所有的数据都能展示出来

      这个判断单元格中的字体大小是否合理的思路也不难,难的是如何获取到需要的参数。

     

    注意点

      1、设置单元格字体大小的方法是:font.setFontHeightInPoints(k),但是获取字体宽度和高度的方法并不精确,因为字体间会有字间距,换行以后行之间也有间距,所以这个算法并不精确。
        这个例子中,我的获取字体高度的方法是直接取 k,获取字体宽度的方法是 k*2

      2、在上诉关键点的第5步中,本来我的想法是 y向下取整, x向上取整,然后再进行比较。但是测试后发现,设置的字体都会偏小。 直接取y>=x,结果反而更合理些。

      3、进行相除运算,单位必须相同。POI中Point(坐标点)和Pixel(像素点)的大小关系,我在之前的文章有介绍过,引用结论,获取行高的像素值的方法就是: (row.getHeightInPoints() / 72) * 96

     

    代码实例

      样例中的单元格是合并单元格,起始坐标 (3,5),结束坐标 (3,8)

    public static void main(String[] args) {
    
        try (InputStream is = new FileInputStream("E:\\test1.xls");
             Workbook book = new HSSFWorkbook(is);) {
    
            Cell cell = book.getSheetAt(0).getRow(3).getCell(5);
            String str = "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十";
            cell.setCellValue(str);
    
            setFontSize(book, cell);
    
            File f = new File("E:\\test2.xls");
            FileOutputStream out = new FileOutputStream(f);
            book.write(out);
        } catch (IOException e) {
            //return;
        }
    }
    
    /**
     * 设置单元格字体大小
     */
    private static void setFontSize(Workbook book, Cell cell) {
        Font font = book.createFont();
        font.setFontName("EUDC");
        for (short k = 10; k >= 5; k--) {
            font.setFontHeightInPoints(k);
            if (checkCellReasonable(cell, k)) {
                break;
            }
        }
        //解决单元格样式覆盖的问题
        CellStyle cStyle = book.createCellStyle();
        cStyle.cloneStyleFrom(cell.getCellStyle());
        cStyle.setWrapText(true);
        cStyle.setFont(font);
        cell.setCellStyle(cStyle);
    }
    
    /**
     * 校验单元格中的字体大小是否合理
     */
    private static boolean checkCellReasonable(Cell cell, short fontSize) {
        int sum = cell.getStringCellValue().length();
        double cellWidth = getTotalWidth(cell);
        double fontWidth = (double) fontSize / 72 * 96 * 2;
        double cellHeight = cell.getRow().getHeightInPoints();
        double rows1 = fontWidth * sum / cellWidth;
        double rows2 = cellHeight / fontSize;
        return rows2 >= rows1;
    }
    
    /**
     * 获取单元格的总宽度(单位:像素)
     */
    private static double getTotalWidth(Cell cell) {
        int x = getColNum(cell.getSheet(), cell.getRowIndex(), cell.getColumnIndex());
        double totalWidthInPixels = 0;
        for (int i = 0; i < x; i++) {
            totalWidthInPixels += cell.getSheet().getColumnWidthInPixels(i + cell.getColumnIndex());
        }
        return totalWidthInPixels;
    }
    
    /**
     * 获取单元格的列数,如果是合并单元格,就获取总的列数
     */
    private static int getColNum(Sheet sheet, int row, int column) {
        int sheetMergeCount = sheet.getNumMergedRegions();
        //判断该单元格是否是合并区域的内容
        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress ca = sheet.getMergedRegion(i);
            int firstColumn = ca.getFirstColumn();
            int lastColumn = ca.getLastColumn();
            int firstRow = ca.getFirstRow();
            int lastRow = ca.getLastRow();
    
            if (row >= firstRow && row <= lastRow && column >= firstColumn && column <= lastColumn) {
                return lastColumn - firstColumn + 1;
            }
        }
        return 1;
    }

     

      其中,获取单元格总宽度的方法getTotalWidth(Cell cell),有更简单的方法,在《我的POI代码库》里介绍

     

    原创文章,欢迎转载,转载请注明出处!

    展开全文
  • EXCEL函数公式集

    热门讨论 2010-03-16 03:26:38
    如何让EXCEL自动从头统计到当前单元格 统计人数 统计人数 求各分数段人数 有什么方法统计偶数 如何显示 工资统计中的问题 统计数据问题一例 根据给定的条件,对数据进行合计 十列数据合计成一列 统计汉字字符个数 ...
  • excel的使用

    2012-11-25 17:06:01
    这时每个单元格中的分工就显示出来了。如果想恢复公式计算结果的显示,就再设置“窗口选项”栏下的“公式”项失效即可。图2(8) 利用Ctrl+*选取文本如果一个工作表中有很多数据表格时,可以通过选定表格中某个...
  • 如何让EXCEL自动从头统计到当前单元格 统计人数 统计人数 求各分数段人数 有什么方法统计偶数 如何显示 工资统计中的问题 统计数据问题一例 根据给定的条件,对数据进行合计 十列数据合计成一列 统计汉字字符个数 ...
  • 为什么使用CRichEditCtrl控件的对话框不能显示出来 如何改变控件的字体 如何限制编辑框的准许字符 如何防止Edit框中的Password被非法获取 如何设置ClistCtr控件为可以整栏选择并且有网格条纹的报表形式 如何给...
  • word使用技巧大全

    热门讨论 2011-03-18 20:37:53
    ★将公式完整显示出来 21 ★增加、删除和显示全部菜单命令 21 ★摒弃“智能菜单”功能 22 ★在屏幕提示中显示快捷键 22 ★快速删除Word不常用的按钮和菜单 22 ★更改菜单打开方式 22 ★更改默认的度量单位 22 ★将...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0269 打开MDI窗体时其他窗体会显示出来的原因 177 8.4 窗体的大小及位置 178 0270 控制窗体的最大化、最小化 178 0271 无标题栏时改变窗体的大小 178 0272 无标题栏最大化时不覆盖任务栏 178 0273 限制...
  • 0269 打开MDI窗体时其他窗体会显示出来的原因 177 8.4 窗体的大小及位置 178 0270 控制窗体的最大化、最小化 178 0271 无标题栏时改变窗体的大小 178 0272 无标题栏最大化时不覆盖任务栏 178 0273 限制...
  • 0269 打开MDI窗体时其他窗体会显示出来的原因 177 8.4 窗体的大小及位置 178 0270 控制窗体的最大化、最小化 178 0271 无标题栏时改变窗体的大小 178 0272 无标题栏最大化时不覆盖任务栏 178 0273 限制...
  • 0269 打开MDI窗体时其他窗体会显示出来的原因 177 8.4 窗体的大小及位置 178 0270 控制窗体的最大化、最小化 178 0271 无标题栏时改变窗体的大小 178 0272 无标题栏最大化时不覆盖任务栏 178 0273 限制...
  • 0269 打开MDI窗体时其他窗体会显示出来的原因 177 8.4 窗体的大小及位置 178 0270 控制窗体的最大化、最小化 178 0271 无标题栏时改变窗体的大小 178 0272 无标题栏最大化时不覆盖任务栏 178 0273 限制...
  • 0269 打开MDI窗体时其他窗体会显示出来的原因 177 8.4 窗体的大小及位置 178 0270 控制窗体的最大化、最小化 178 0271 无标题栏时改变窗体的大小 178 0272 无标题栏最大化时不覆盖任务栏 178 0273 限制...
  • 更新说明:完善了界面,去除了不必要的数字显示,将菜单栏动态切换显示的加重效果写了出来,更加方便使用 8-16更新说明:1,删除了功能菜单中的学期信息,因为我也不知道这个菜单里要放什么内容,2.在添加信息里...
  • asp.net知识库

    2015-06-18 08:45:45
    页面一postback,它就显示页面的最顶端,怎样它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值 Asp...
  • MAPGIS地质制图工具

    2013-05-06 16:15:30
    1、MapGis数据转入Excel后表格内容为空白什么原因? 答:可能原因是转的时候没有正常关闭com接口,可以关闭Section,重新打开Section再试试,或者打开任务管理器,关闭所有Excel进程。 2、Excel单元格数据转入MapGis...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    Excel文件的导入和导出操作 如题。主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    -增加示例-如何将Grid控件导出为Excel(data\grid_excel_run.aspx)(feedback:503684912)。 -如果TreeNode的属性Enabled="false",则此项变灰并且不会被选中(feedback:your568)。 -修正TreeNode的属性NavigateUrl不...
  • -增加示例-如何将Grid控件导出为Excel(data\grid_excel_run.aspx)(feedback:503684912)。 -如果TreeNode的属性Enabled="false",则此项变灰并且不会被选中(feedback:your568)。 -修正TreeNode的属性NavigateUrl不...
  •  bootcfg /rebuild 重复全部 Windows 安装过程并允许用户选择要添加的内容。  注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。  bootcfg /scan 扫描用于 Windows 安装的...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

如何让excel内容全部显示出来