`
simple_hui
  • 浏览: 154907 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

jxl处理图片

阅读更多
这两天要用,临时在网上找的。
  
/*
   // ok: 从本地文件得到图片资源,写到xls中
   java.io.File image8 = new java.io.File("E:\\logo.png");
   WritableImage wimage = new WritableImage( 2, 7, 2.5, 2.5, image8 );
   ws.addImage( wimage );
   */
        
        // ok: 从internet得到图片资源,写到xls中
        HttpClient client = new HttpClient();
        String url76 = "http://www.google.cn/images/nav_logo3.png";
        GetMethod get77 = new GetMethod( url76 );
        client.executeMethod( get77 );
        byte[] bb77 = get77.getResponseBody();
        java.io.InputStream is77 = get77.getResponseBodyAsStream();
        // 关闭 HttpClient 连接
        get77.releaseConnection();
        
        // 获取图象大小, ok: 2007-12-11 17:29:35
        BufferedImage bi7 = ImageIO.read( is77 );
        
        // another interface such as: read(InputStream input) 
        int picWidth = bi7.getWidth(); // 图片宽, 像素 150
        int picHeight = bi7.getHeight(); // 图片高, 像素 105
        
        //test
        System.out.println("--1703");
        System.out.println("Width=" + picWidth );
        System.out.println("Height=" + picHeight );

        // 输入参数, 图片显示的位置
        double picBeginCol = 1.2;
        double picBeginRow = 1.2;

        /*
            实际像素: 150/105 = 2.78 cm / 3.97 cm = 4832 / 1590
            实际像素: 300/210 =           2倍大小 = 9600 / 3150 比率: 32 / 15
        */
        // 计算参数( picCellWidth, picCellHeight ), 图片显示大小, 默认 100% 显示: begin
        //     图片cell宽度 = 图片实际跨越每个cell所占长度的相对各个cell ratio的和
        //     方法: 根据起始位置,计算图片实际跨越的区域, 然后计算相对ratio,然后累加
        // 
        double picCellWidth = 0.0; // 是 cell的跨越个数, 可小数
        double picCellHeight = 0.0;
        // wc = ws.getWritableCell( picBeginCol, picBeginRow ); // 列,行
        // ws.getColumnView( picBeginCol ).getSize();
        // ws.getRowView( picBeginRow ).getSize();

        int _picWidth = picWidth * 32 ; // pic的宽度,循环递减, 是jxl的宽度单位, 32/15
        for(int x=0; x< 1234; x++)
        {
            int bc = (int)Math.floor( picBeginCol + x ); // 3.6 to 3 // 本次循环所在cell位置
            System.out.println("x =" + x ); //test
            System.out.println("bc =" + bc ); //test
            int v = ws.getColumnView( bc ).getSize(); //本次cell宽,jxl单位
            double _offset0 = 0.0; // >= 0 // 离左边的偏移量, 仅 x = 0 的时候才用
            if( 0 == x )
                _offset0 = ( picBeginCol - bc ) * v ; // 
            
            System.out.println("_offset0 =" + _offset0 ); //test
            System.out.println("_picWidth =" + _picWidth ); //test
            System.out.println("v =" + v ); //test
            System.out.println("cw 00=" + ws.getColumnView( 0 ).getSize() ); //test
            System.out.println("ch 00=" + ws.getRowView( 0 ).getSize() ); //test
            System.out.println("cw 22=" + ws.getColumnView( 2 ).getSize() ); //test
            System.out.println("ch 22=" + ws.getRowView( 2 ).getSize() ); //test
            
            if( 0.0 + _offset0 + _picWidth > v ) // _picWidth 剩余长度超过一个cell时
            {
                // 计算本次cell内, pic 所占 ratio值, 累加到 picCellWidth
                double _ratio = 1.0;
                if( 0 == x )
                    _ratio = ( 0.0 + v - _offset0 ) / v;
                System.out.println("_ratio =" + _ratio ); //test
                // picCellWidth += 1.0;
                picCellWidth += _ratio;
                _picWidth -= (int)( 0.0 + v - _offset0 ); // int
            } 
            else // _picWidth 剩余长度在一个cell内时
            {
                double _ratio = 0.0;
                if( v != 0 )
                    _ratio = ( 0.0 + _picWidth ) / v;
                picCellWidth += _ratio;
                System.out.println("for: picCellWidth =" + picCellWidth ); //test
                break;
            }
            if( x >= 1233 )
                ntTool.ntSysOut("enwl_print_report_xls: 446: x >= 1233,循环超限,不影响运行,影响速度"); //
        } // for
        // 此时 picCellWidth 是图片实际的值了

        //
        int _picHeight = picHeight * 15 ; // pic的高度,循环递减, 是jxl的高度单位, 32/15
        for(int x=0; x< 1234; x++)
        {
            int bc = (int)Math.floor( picBeginRow + x ); // 3.6 to 3 // 本次循环所在cell位置
            int v = ws.getRowView( bc ).getSize(); //本次cell高,jxl单位
            double _offset0 = 0.0; // >= 0 // 离顶部的偏移量, 仅 x = 0 的时候才用
            if( 0 == x )
                _offset0 = ( picBeginRow - bc ) * v ; // 
            if( 0.0 + _offset0 + _picHeight > v ) // _picHeight 剩余长度超过一个cell时
            {
                // 计算本次cell内, pic 所占 ratio值, 累加到 picCellHeight
                double _ratio = 1.0;
                if( 0 == x )
                    _ratio = ( 0.0 + v - _offset0 ) / v;
                // picCellHeight += 1.0;
                picCellHeight += _ratio;
                _picHeight -= (int)( 0.0 + v - _offset0 ); // int
            } 
            else // _picHeight 剩余长度在一个cell内时
            {
                double _ratio = 0.0;
                if( v != 0 )
                    _ratio = ( 0.0 + _picHeight ) / v;
                picCellHeight += _ratio;
                break;
            }
            if( x >= 1233 )
                ntTool.ntSysOut("enwl_print_report_xls: 446: x >= 1233,循环超限,不影响运行,影响速度"); //
        } // for
        // 此时 picCellHeight 是图片实际的值了
        // 计算参数( picCellWidth, picCellHeight ), 图片显示大小, 默认 100% 显示: end
       

        //test
        System.out.println("picBeginCol=" + picBeginCol );
        System.out.println("picBeginRow=" + picBeginRow );
        System.out.println("picCellWidth=" + picCellWidth );
        System.out.println("picCellHeight=" + picCellHeight );
       

        WritableImage wimage = new WritableImage( picBeginCol,picBeginRow, picCellWidth,picCellHeight, bb77 );
        
        // WritableImage wimage = new WritableImage( 2.2, 3.2, 2.3, 2.8, bb77 );
        
        // 图片写到xls中
        ws.addImage( wimage );
        // 写图片: end
        
        
        
        // 保护, 不让修改, protect:
        if( is_rpt_readOnly )
        {
            ws.getSettings().setProtected(true);
            ws.getSettings().setPassword( rpt_readOnly_pwd );
        }

        jxl.write.WritableCell wc = null; // equal to global

    
    // 处理第 i_sheet 张 Sheet表
    Sheet rs = rwb.getSheet( i_sheet );
   
分享到:
评论
2 楼 zhangyatong 2012-10-23  
zhangyatong 写道
ws.getColumnView( bc ).getSize() 这个值 jxl单位  怎么跟px 运算?

明白了,实际大小 * 32是宽度

宽度是30倍
高度是15倍

1 楼 zhangyatong 2012-10-23  
ws.getColumnView( bc ).getSize() 这个值 jxl单位  怎么跟px 运算?

相关推荐

    jxl api说明文档

    JXL不仅能够处理XLS文件,还能处理Biff8文件格式,这是Excel 97到2003版本所使用的格式。 二、JXL核心组件 1. **Workbook**:工作簿对象是Excel文件的抽象,它可以包含多个工作表。 2. **Sheet**:工作表是工作簿中...

    jxl读写excel数据,输出图片

    JXL库提供了方便的API,使得开发者可以轻松地处理Excel数据,包括读取单元格内容、修改工作表、添加公式,以及本文重点讨论的——插入和输出图片。 **一、JXL库介绍** JXL是一个开源的Java库,专门用于处理Excel...

    jxl.zip_excel_jxl_jxl.biff.drawing.dg_jxl.biff.drawingdg

    此外,它还能处理Excel的图像和超链接,提供了一种灵活的方式来处理带有多媒体内容的Excel文件。 5. **性能优化**:JXL库设计时考虑到了性能,能够高效地处理大量数据,适合在大数据场景下使用。其内存占用相对较低...

    jxlAPI(jxl完整的API)

    8. **图片处理**: jxl允许在工作表中插入图片,通过`Picture`类和`Sheet.addImage()`方法实现。 9. **事件驱动模型**: jxl还提供了事件驱动的读取模型,通过监听器接口(如`CellReadListener`)可以实现只读取特定...

    jxl操作jxl操作

    jxl 是一个非常强大的工具库,它不仅能够帮助开发者轻松地读写 Excel 文件,还提供了一系列高级功能,如设置单元格格式、插入图片等。对于那些需要频繁处理 Excel 文件的应用来说,jxl 是一个不可或缺的选择。不过...

    关于jxl操作excel说明以及jxl.jar包下载2.6

    JXL支持将图像插入Excel文件,但需要注意,图片必须是BMP格式。使用`Picture`类创建图像对象,然后添加到工作表。 6. **行和列操作**: 可以使用`Row`和`Column`对象来操作Excel的行和列,包括插入、删除、设置...

    jxl架包下载

    JXL库支持多种操作,包括设置单元格格式(如字体、颜色、对齐方式)、合并单元格、读写公式、处理图表、处理图像等。虽然JXL对于处理较旧的Excel格式(如.BIFF8,即Excel 97-2003格式)非常有效,但请注意它不支持较...

    jxl对excel添加水印(含有setWaterMarkImage方法).zip

    但是,通过利用`jxl.write.WritableImage`类和一些图像处理技巧,我们可以实现自定义的水印效果。水印通常用于保护文档的版权或传达敏感性信息,它通常以半透明的方式叠加在文档上。 1. **准备工作**: 在开始之前...

    jxl源码及jar包

    再者,jxl库并未忽视图像和图表的支持。这使得开发者可以将图片嵌入到Excel文件中,或者创建基于数据的图表,如柱状图、饼图等,这对于数据分析和报告展示极具价值。通过jxl,你可以实现动态生成包含图表的Excel文件...

    word操作jxlApi

    在这个过程中,需要注意的是,JXL可能无法完全保留Word的复杂格式,比如特定的字体、图片和布局。因此,这种方法适用于对Word文档进行简单编辑,对于复杂的格式转换可能效果不佳。 此外,`jxl.format`包中的类可以...

    JXL - JAR包

    标题提及的“JXL - JAR包”是指Java eXtensions for Lotus (JXL),这是一个广泛使用的开源库,专门用于处理Excel电子表格文件。JXL库提供了一组易于使用的API,使得Java开发者可以方便地读取、写入以及修改Excel文件...

    java jxl的jar包 官方下载版

    Java中的JXL库是一个强大的工具,专为处理Excel文件而设计。这个官方下载版的`jxl.jar`包含了处理Excel工作簿、工作表、单元格等所有必要的功能,使得Java开发者能够轻松地读取、写入和修改Excel数据。本文将深入...

    jxl支持jdk1.5

    JExcelApi提供了一种灵活的方式来处理Excel电子表格,包括创建新的工作簿、读取现有工作簿、修改单元格内容、设置格式以及处理图表和图像等。这个库在Java社区中广泛使用,尤其适用于那些需要将数据导入导出到Excel...

    jxl-1.7.1.jar

    5. **处理图片和图表**:虽然jxl的主要焦点是单元格数据,但它也能处理Excel文件中的图片和图表。开发者可以通过`Picture`类插入图片,但需要注意的是,jxl不支持创建复杂的图表。 6. **性能和兼容性**:jxl库在...

    Java_Jxl开发.doc

    - **图像和图表支持**:虽然支持有限,但jxl确实提供了添加图像和简单图表的能力,不过仅支持PNG格式。 #### 三、jxl API 主要组件 jxl库的核心组件包括: 1. **Workbook**:代表整个Excel文件。每个Excel文件对应...

    jxl操作excel文件例子

    5. **处理图片**:JXL库也支持在Excel文件中插入图片。首先需要将图片转换为字节数组,然后使用`WritableImage`类创建一个可写的图像对象,并添加到工作表中。 6. **读写保护与密码**:JXL库提供了设置文件读写权限...

    jxl中文教程

    - **POI** 提供更全面的功能,但可能在某些细节上有小bug,并且在处理图片上不如jxl方便。POI更适合涉及复杂公式计算的应用场景。 - **性能比较**: - **内存消耗**:对于相同的数据量,jxl表现出更好的内存管理...

    jxl帮助文档

    5. **图像处理**:JXL还支持将图片插入到Excel工作表中,这在生成报告或者数据分析的Excel文件时非常有用。 6. **数据流处理**:JXL提供了处理大量数据的能力,通过数据流模型,可以有效地处理大文件,避免内存溢出...

    jxl相关jar和api

    JXL还支持更复杂的功能,如公式计算、图表、图像和超链接。例如,你可以通过`Formula`类创建包含Excel公式的单元格,而`WritableImage`则用于在工作表中插入图片。 在处理大量数据时,JXL提供了流式处理模式,可以...

    jxl.jar的使用

    7. **处理图片**:JXL库可以将图像插入到Excel工作表中,支持BMP、JPEG、GIF等常见格式。 在使用jxl.jar之前,确保将其添加到项目的类路径中,如果是Maven项目,可以在pom.xml文件中添加依赖。在Java代码中,使用`...

Global site tag (gtag.js) - Google Analytics