当前位置: 首页 > news >正文

付网站建设费分录/廊坊seo排名霸屏

付网站建设费分录,廊坊seo排名霸屏,数字化文化馆网站建设,自己的电脑做网站可以吗文章目录 一、POI设置样式二、POI导出图片1.解释XSSFClientAnchor 三、加载指定模板导出四、👉Workbook、XSSFWorkbook与SXSSFWorkbook1.大数据量导出1)根据数据量选择XSSFWorkbook,还是SXSSFWorkbook 书接上篇:工具类——Java 浏…

文章目录

  • 一、POI设置样式
  • 二、POI导出图片
    • 1.解释XSSFClientAnchor
  • 三、加载指定模板导出
  • 四、👉Workbook、XSSFWorkbook与SXSSFWorkbook
    • 1.大数据量导出
      • 1)根据数据量选择XSSFWorkbook,还是SXSSFWorkbook

书接上篇:工具类——Java 浏览器导入、导出Excel(Java import、export)demo
在这里插入图片描述
POI的导出方式:创建/加载Workbook,设置样式,填充数据,然后生成本地临时文件,最终以浏览器的形式打开,完成整个导出动作。

一、POI设置样式

demo如下,

private void setCellStyleDemo(T wb, T sheet) {def row1 = sheet.createRow(1)// 创建style并设置样式CellStyle style1 = wb.createCellStyle()style1.setWrapText(true)// 文本自动换行style1.setAlignment(HorizontalAlignment.CENTER)// 水平居中style1.setVerticalAlignment(VerticalAlignment.CENTER)// 垂直居中style1.setBorderLeft(BorderStyle.THIN)// 设置左边框style1.setBorderTop(BorderStyle.THIN)// 设置上边框style1.setBorderRight(BorderStyle.THIN)// 设置右边框style1.setBorderBottom(BorderStyle.THIN)// 设置下边框// 设置字体Font font1 = wb.createFont()font1.setFontHeight(11)// 大小font1.setBold(true)// 加粗与否style1.setFont(font1)// 填充单元格value为“序号”,并未它设置以上样式row1.createCell(0).setCellValue("序号")row1.getCell(0).setCellStyle(style1)// 设置列宽、行高sheet.setColumnWidth(0, 5 * 256)// 设置第一列宽度为5个字符宽度for (int i = 1; i <= len; i++) {sheet.setColumnWidth(i, 20 * 256)// 设置第二至…宽度为20个字符宽度}row0.setHeightInPoints(50)// 设置第1行高度为50px
}

二、POI导出图片

demo如下,

 /*** 加载头像,并填充* @param wb (xlsx)* @param sheet 页签* @param imgUrl 图片路径* @return 是否填充图片:否,填充(2寸照片)的字眼*/boolean setPngToSheet(XSSFWorkbook wb, XSSFSheet sheet, String imgUrl) {if (imgUrl.indexOf(".") == -1) {return false}String imgType = imgUrl.substring(imgUrl.indexOf(".") + 1)// jpg、png…FileInputStream fsByteArrayOutputStream baostry {File imgFile = new File(imgUrl)fs = new FileInputStream(imgFile)baos = new ByteArrayOutputStream()BufferedImage bi = ImageIO.read(fs)// 图片入流ImageIO.write(bi, imgType, baos)// 写入excelXSSFDrawing patriarch = sheet.createDrawingPatriarch()// 图片导入指定单元格XSSFClientAnchor anchor = new XSSFClientAnchor(350, 100, 150, 0, (short) 8, 2, (short) 9, 6)int typeswitch (imgType) {case "png":type = XSSFWorkbook.PICTURE_TYPE_PNGbreakcase "jpg":type = XSSFWorkbook.PICTURE_TYPE_JPEGbreakdefault:type = 6// PNG}// 插入图片patriarch.createPicture(anchor, wb.addPicture(baos.toByteArray(), type))} catch (Exception ex) {logger.error("统战个人图片插入失败", ex)return false} finally {if (fs != null) {fs.close()}if (baos != null) {baos.close()}}return true}

1.解释XSSFClientAnchor

XSSFClientAnchor anchor = new XSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2)

👉源码,

/*** Creates a new client anchor and sets the top-left and bottom-right* coordinates of the anchor by cell references and offsets.* Sets the type to {@link AnchorType#MOVE_AND_RESIZE}.** @param dx1  the x coordinate within the first cell.* @param dy1  the y coordinate within the first cell.* @param dx2  the x coordinate within the second cell.* @param dy2  the y coordinate within the second cell.* @param col1 the column (0 based) of the first cell.* @param row1 the row (0 based) of the first cell.* @param col2 the column (0 based) of the second cell.* @param row2 the row (0 based) of the second cell.*/public XSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2) {anchorType = AnchorType.MOVE_AND_RESIZE;cell1 = CTMarker.Factory.newInstance();cell1.setCol(col1);cell1.setColOff(dx1);cell1.setRow(row1);cell1.setRowOff(dy1);cell2 = CTMarker.Factory.newInstance();cell2.setCol(col2);cell2.setColOff(dx2);cell2.setRow(row2);cell2.setRowOff(dy2);}

👉解释,

  • dx1:表示图片左上角相对于单元格左边界的X轴偏移量,单位为英寸/EMU;
  • dy1:表示图片左上角相对于单元格顶部边界的Y轴偏移量,单位为英寸/EMU;
  • dx2:表示图片右下角相对于单元格左下角的X轴偏移量,单位为英寸/EMU;
  • dy2:表示图片右下角相对于单元格左下角的Y轴偏移量,单位为英寸/EMU;
  • col1:表示该锚点对应的起始单元格列号,从0开始计数;
  • row1:表示该锚点对应的起始单元格行号,从0开始计数;
  • col2:表示该锚点对应的结束单元格列号,从0开始计数;
  • row2:表示该锚点对应的结束单元格行号,从0开始计数。

👉例如,
XSSFClientAnchor anchor = new XSSFClientAnchor(350, 100, 150, 0, (short) 8, 2, (short) 9, 6)

1)后四位,设置图片位置:

  • 左上角位于:第9列,第3行
  • 右下角位于:第10列,第7行

2)前四位,设置图片收缩距离:

  • 与左侧间隔350英寸/EMU
  • 与上侧间隔100英寸/EMU
  • 与右侧间隔150英寸/EMU
  • 与下侧间隔0英寸/EMU
    在这里插入图片描述

三、加载指定模板导出

demo如下,

/*** 加载指定模板* @param path 文件路径* @return 返回Workbook,可指定XSSFWorkbook或者SXSSFWorkbook*/private Workbook readTemplateFile(String path) {FileInputStream fsWorkbook wb = nulltry {File temFile = new File(path)fs = new FileInputStream(temFile)// 读取模板文件wb = new Workbook(fs)} catch (Exception ex) {logger.error("加载EXCEL模板失败", ex)} finally {if (fs != null) {fs.close()}}return wb}

四、👉Workbook、XSSFWorkbook与SXSSFWorkbook

Workbook是XSSFWorkbook与SXSSFWorkbook的父类,可以用父类指向子类来调用不确定的子类方法。

XSSFWorkbook和SXSSFWorkbook都是Java中Apache POI库提供的用于操作Excel文档的对象,其中XSSFWorkbook是基于内存模型(in-memory model)实现的,而SXSSFWorkbook则是基于流的方式(streaming way)实现的。

区别主要体现在以下两个方面:

1、内存占用:XSSFWorkbook会将整个Excel文档加载到内存中,因此在处理大量数据时,需要消耗大量的内存。而SXSSFWorkbook采用基于流的方式,将一个sheet中的数据分段写入磁盘以避免内存溢出,因此能够更好地处理海量数据,并且占用的内存较少。

2、性能表现:由于SXSSFWorkbook采用了基于流的方式进行Excel文件的操作,使得其性能表现优于XSSFWorkbook,尤其是对于导出海量数据的情况下,SXSSFWorkbook的速度可能会显著快于XSSFWorkbook。

因此,建议在处理大规模Excel数据时,选择采用SXSSFWorkbook对象,而在需求较小的情况下,XSSFWorkbook也可以满足相关操作需求。

1.大数据量导出

注意点一:
SXSSFWorkbook wb = new SXSSFWorkbook()
初始化时,未指定窗口大小,默认使用100.

1、在写入数据时,只有在当前窗口内的数据才会被缓存到内存中,之外的数据将直接写入到硬盘上,并且该窗口会随着当前位置的移动而进行滚动更新
2、缓存窗口的大小一般需要根据具体应用场景和系统资源情况来确定,并没有一个固定的标准。缓存窗口可以理解为内存中的缓存区,它用于暂时存储待处理的数据或文件,并能够提高程序的读写速度和响应时间。
3、 在实际应用中,选择合适的缓存窗口大小需要考虑多个因素,包括数据大小、读写频率、系统内存大小、CPU处理能力等,以及操作系统、数据库、网络传输等其他相关因素。通常情况下,我们可以通过建立模拟测试环境来评估不同缓存窗口大小对系统性能的影响,并根据测试结果进行调整和优化。

注意点二:
其中数据量大时,使用SXSSFWorkbook需要:

if (sheet instanceof SXSSFWorkbook) {// 一些情况下,可能会在循环遍历过程中频繁地创建行(Row)对象,此时执行完一定数量的行(Row)对象后,调用flushRows方法可以显式地告知系统将缓存数据写入磁盘,降低内存占用(避免OOM)。((SXSSFSheet) sheet).flushRows()
}

1、一般来说,flushRows方法的调用频率取决于内存使用情况和可用内存的大小。如果数据量很大,内存持续占用,就需要更加频繁地调用flushRows方法,以便及时释放内存。
2、 具体来说,可以根据系统的可用内存、JVM的堆内存设置以及数据集合所需内存的大小等变化情况,适当调整flushRows方法的使用策略。常见的建议是每3000~5000行调用一次flushRows方法,这样可以有效地平衡内存占用和程序性能。
3、特别是在处理大数据集时,推荐使用SXSSF工作簿,并结合设置缓存窗口大小的方式来优化性能:通过SXSSFWorkbook类的setRowAccessWindowSize(int rowAccessWindowSize)方法,来设置缓存窗口大小,在写入数据时,只有在当前窗口内的数据才会被缓存到内存中,之外的数据将直接写入到硬盘上,并且该窗口会随着当前位置的移动而进行滚动更新,从而实现最大程度的内存优化。

1)根据数据量选择XSSFWorkbook,还是SXSSFWorkbook

已有一套XSSFWorkbook导出,但是当数据量较大时(假如3000条以上),我想使用SXSSFWorkbook流式导出

demo如下,
在我保留XSSFWorkbook的前提下,数据量大使用SXSSFWorkbook,数据量小依旧使用XSSFWorkbook,

def exportPersonPool(@Nullable Object... args) {      try {// 查询数据量Long count = 2000// 查询数据库,统计待导出数据总数def wbif (count > PERSON_MAX_SIZE) {wb = exportPersonPoolLarge(args, count)} else {wb = exportPersonPoolSmall(args)}// 生成导出路径,略return MyExcelUtil.getMyExportExcel(wb, String.format("测试导出表%s%s",System.currentTimeMillis(), ExcelUtil.XLSX))} catch (Exception ex) {logger.error("导出失败", ex)}}/*** 大数据量*/SXSSFWorkbook exportPersonPoolLarge(@Nullable Object... args, Long count) {// 使用默认窗口大小100SXSSFWorkbook wb = new SXSSFWorkbook()// 获取sheet,并填充数据SXSSFSheet sheet = wb.createSheet("mySheet")// 设置导出头,略buildPoolSheetHeader(wb, sheet, args)// 设置当前页1\2,int countPageIndex = (int) Math.ceil(count / PERSON_MAX_SIZE)for (int i = 1; i <= countPageIndex; i++) {List<Map<String, Object>> dataList = getPersonPool(args, i)// 分页查询数据库// 填充sheet,略fillPoolSheet(wb, sheet, fillList, dataList, i)}return wb}/*** 小数据量*/XSSFWorkbook exportPersonPoolSmall(@Nullable Object... args) {XSSFWorkbook wb = new XSSFWorkbook()// 获取sheet,并填充数据XSSFSheet sheet = wb.createSheet("mySheet")// 设置导出头,略buildPoolSheetHeader(wb, sheet, args)List<Map<String, Object>> dataList = getPersonPool(args,1)// 查询数据库(第一页)// 填充sheet,略fillPoolSheet(wb, sheet, fillList, dataList, 1)return wb}/*** 填充sheet*/private void fillPoolSheet(@Nullable Object... args) {// 略if (sheet instanceof SXSSFWorkbook) {((SXSSFSheet) sheet).flushRows()}}

上文路径:工具类——Java 浏览器导入、导出Excel(Java import、export)
如何生成临时文件,参考:导出/service后半段
如何浏览器下载,参考:导出/controller后半段

为脱敏手改代码,可能存在错误,还请与我交流,谢谢!

http://www.jmfq.cn/news/4731139.html

相关文章:

  • 网络营销策划书实施计划/seo怎么优化方案
  • 青岛哪家网站建设好/网站建设明细报价表
  • 网站建设销售问答/成都自然排名优化
  • 音乐摄影网站建设宗旨/网站页面seo
  • 衡阳市住房和城乡建设局官方网站/googleplay安卓版下载
  • 做旅游销售网站平台ppt模板/线上推广100种方式
  • 网站建设定制网站建设公司哪家好/站长之家音效素材
  • adobe可以做网站吗/网络推广怎么做
  • 天津 企业网站建设/百度问答平台
  • 页面好看的教育类网站模板/加盟培训机构
  • wordpress 浮动按钮/seo网站推广免费
  • 网站开发加盟商怎么做/网盟推广平台
  • 高校文明校园建设专题网站/如何交换优质友情链接
  • 做公司网站宣传公司/企业建站平台
  • 和田网站建设/百度刷自己网站的关键词
  • 手机官方网站/打开免费百度啊
  • 网站开发技术与vb/谷歌seo招聘
  • 装修设计网站有哪些/百度网页版首页
  • 湖南做网站seo/seo网站推广批发
  • 正常开发一个网站需要多少钱/免费隐私网站推广
  • 制作公司网站需要那些资料/大数据平台
  • 同城网站/阳江网站建设
  • 定制公司网站建设/百度域名收录提交入口
  • 外国网站 游戏设定图/如何搭建个人网站
  • 旅游电子商务网站的品牌建设/seo外包优化
  • 一个网站如何创建多个页面/互动营销
  • 深圳在线直播/seo优化培训学校
  • 装修网站设计图推荐/百度网盘登录首页
  • 做网站想要中立/我想做地推怎么找渠道
  • ui设计师是什么意思/搜狗seo