table导出为Excel jxl

平时用js导出table有些不足,导出的Excel内容也不够好看。

所以写了个通用的将Table导出为Excel的方法,可完成表格导出(不支持嵌套table)。

js计算cellStrArray部分参考http://fireinjava.iteye.com/admin/blogs/759190

 

代码如下:

   构造字符串:每个对象以row,col,rowSpan,colSpan,value形式组成串,以便Jxl来addCell、mergeCells。

   说明:jxl创建Cell用的是 WritableSheet.addCell(new Label(col, row,value,style))

                      跨行跨列用的是WritableSheet.mergeCells(col, row, col2,row2)

/**
 浏览器判断
 */
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
if (window.ActiveXObject)
	Sys.ie = ua.match(/msie ([\d.]+)/)[1];
else if (document.getBoxObjectFor)
	Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1];
	
function containsArray(array, obj) {
	for (var i = 0; i < array.length; i++) {
		if (array[i] == obj) {
			return i;
			break;
		}
	}
	return -1;
}

Array.prototype.contains = function(obj) {
	return containsArray(this, obj);
}

function exportTableToJxlExcel(sheetName,tableId) {
	
	var offsetLeftArray = new Array();
	var cell;// 单元格Dom
	var col;// 单元格实际所在列
	var cellStr;// 每个cell以row,col,rowSpan,colSpan,value形式
	var cellStrArray = [];
	var objTab = document.getElementById(tableId);

	// 遍历第一次取出offsetLeft集合
	for (var i = 0; i < objTab.rows.length; i++) {
		for (var j = 0; j < objTab.rows[i].cells.length; j++) {
			cell = objTab.rows[i].cells[j];
			if (offsetLeftArray.contains(cell.offsetLeft) == -1)
				offsetLeftArray.push(cell.offsetLeft);
		}
	}

	offsetLeftArray.sort(function(x, y) { return parseInt(x) - parseInt(y); });
	//alert("offsetLeft集合:" + offsetLeftArray.join(','));

	// 遍历第二次生成cellStrArray
	for (var i = 0; i < objTab.rows.length; i++) {
		for (var j = 0; j < objTab.rows[i].cells.length; j++) {
			cell = objTab.rows[i].cells[j];
			col = offsetLeftArray.contains(cell.offsetLeft);
			cellStr = i + ',' + col + ',' + cell.rowSpan + ',' + cell.colSpan + "," + (Sys.firefox?cell.textContent:cell.innerText);
			cellStrArray.push(cellStr);
		}
	}

	// 显示
	//var str = "行,列,rowSpan,colSpan,值\n";
	//str += cellStrArray.join('\n');
	//alert(str);
	
	//把cellStrArray传到后台	
	buffalo.remoteCall("ReportExcelExport.export", ['sheet名称',cellStrArray], function(reply){
		var result = reply.getResult();
		if(result!=null && result.length>0){
	    	document.location.href = "<%=request.getContextPath()%>/prj/common/download.jsp?fileName="+result;
		}else{
			alert("无相关记录");
		}
 	});
		
}

  

 

 java后台部分:

  Jxl生成EXCEL(其中ExcelUtil参考 http://fireinjava.iteye.com/blog/702905 )

 

	public String exportToJxlExcel(String sheetName, String[] cellStrArray) {
		try {
			String fileName = "E:/table.xls";// TODO 
			FileOutputStream os = new FileOutputStream(fileName);
			if (cellStrArray != null && cellStrArray.length > 0) {
				WritableWorkbook wwb = Workbook.createWorkbook(os);
				WritableCellFormat wcf_title = ExcelUtil.createWcfTitle();
				WritableCellFormat wcf_text = ExcelUtil.createWcfText();
				WritableSheet ws = wwb.createSheet(sheetName, 0);
				for (int i = 0; i < 20; i++)
					ws.setColumnView(i, 20);

				Label lbl = null;
				String[] objProps = null;
				int col;
				int row;
				int rowSpan;
				int colSpan;
				for (String objStr : cellStrArray) {// 每个对象以row,col,rowSpan,colSpan,value形式
					objProps = objStr.split(",");
					col = Integer.parseInt(objProps[1]);
					row = Integer.parseInt(objProps[0]);
					rowSpan = Integer.parseInt(objProps[2]);
					colSpan = Integer.parseInt(objProps[3]);
					lbl = new Label(col, row, objProps[4], row == 0 ? wcf_title : wcf_text);
					ws.addCell(lbl);
					if (rowSpan > 1 || colSpan > 1)
						ws.mergeCells(col, row, col + colSpan - 1, row + rowSpan - 1);
				}

				wwb.write();
				wwb.close();
				os.close();
				os.flush();
				return fileName;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

 

  前台提交到后台的值,如:

[0,0,1,1,品牌, 0,1,1,1,型号, 0,2,1,1,数量(单位:万), 0,3,1,1,百分比, 1,0,3,1,LG, 1,1,1,1,KF510, 1,2,1,1,0, 1,3,1,1,0.02%, 2,1,1,1,KG129, 2,2,1,1,0.001, 2,3,1,1,0.1%, 3,1,1,1,合计, 3,2,1,1,0.001, 3,3,1,1,0.12, 4,0,1,2,合计, 4,2,1,1,0.001, 4,3,1,1, ]

 

来个简单的效果图:

 

 

根据jxl,对html中的table进行导出excel 工具类中有两个方法,一个是根据前台传入的table的html代码进行导出excel(可以只自定义表格名称/sheet页名称)。还一种是根据html文件,代码自动解析出table然后进行excel导出 立即下载

相关推荐

Cygwin安装教程

简介 cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件 Cygwin就是一个windows软件,该软件就是在windows上仿真linux操作系统 简言之,cygwin是一个在windows平台上运行的 linux模拟环境,使用一个Dll(动态链接库)来实现 这样,我们可以开发出Cygwin下的UNIX工具,使用这个DLL运行在W...

Errol's Blog 13万+

jxl从html中的table中导出数据到execl

第一步:js从table中拿到数据

眼前一座山,踏平它 1466

论文解析-sciPENN

用这2个CITE-seq共有的protein作为训练集,分别将他们特有的protein作为测试集,评估sciPENN对CITE-seq数据集中缺失的protein丰度预测准确度。来自Seurat 4 的PBMC数据集,样本被注射水疱性口炎病毒 (VSV) 载体 HIV 疫苗,数据集包含每个样本注射疫苗0天、3天、7天的CITE-seq数据。PBMCs作为训练集,MALT作为测试集,利用scRNA-seq测试17个蛋白质表达水平。Monocyte:随机取4个样本作为训练集,剩余4个样本作为测试集。

weixin_46065198的博客 1023

Jsp 导出Excel,Word文件几种方法

1.直接输出table格式 资助项目名称:资助项目名称 流水号:流水号 资助编号: 资助编号 注意:乱码问题,页面保存为utf-8格式 编码格式转换: String s=""; s=new S

_修铁路的、的博客 887

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释

uniapp实现文本的展开与收起功能,uniapp展开全部和收起,uniapp里文本的展开与收起,uniapp中文本内容超出规定行数后展开收起的处理,UNIAPP兼容h5、微信小程序多行文本展开或收起,uni-app中,文字超出隐藏并显示省略号(实现展开、收起全文),uni-app中文本过长-实现折叠与展开效果,中文本内容超出规定行数(字数)后展开收起的处理,超出部分...显示,uniapp适用于uniapp多行文本溢出显示...,多行文本展开或收起,uni-app-文本展开/收起折叠功能,支

🏆 前端领域优质创作者 5643

pageoffice java api_Java集成pageoffice导出Excel

一、需求介绍当前B/S模式已成为应用开发的主流,而在开发企业办公系统的过程中,常常有客户这样子要求:把系统数据库中的数据导出到Excel,用户查看报表时直接用Excel打开。或者是:用户已经习惯用Excel打印,也就要求必须把数据导入到Excel文件。这样在我们实际的开发中,很多时候需要实现导出Excel的应用。目前从网上找到的比较常用的实现Java导出Excel的技术有三种 POI、JXL、Pa...

weixin_35901163的博客 872

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1275

把HTML无嵌套表格完美导出为Excel文件的方法

原文地址:http://www.java2000.net/viewthread.jsp?tid=1977 此方法生成xls文件,不是那种简单的通过文件头来实现的那种。而是真正的Excel文件。 此方法支持那种合并的单元格,需要jxl类库的支持。 jxl 的下载地址 http://sourceforge.net/project/showfiles.php?group_id=79926  如果打不...

java2000.net 157

【Clickhouse】Cannot allocate block number in Zookeeper write prefix view location

我有一个问题,我CK集群跑批的时候,replicated表变成只读的了下面是CK的报错和当时ZK的日志。下面是zk报错开始 我认为是写入的时候,压力太大,ZK扛不住了,就按照博客里的建议优化了ZK的参数,现在偶尔还会只读,zk报错都是图里的那种clickhouse的集群是5分片的集群,数据量比较大。每小时批量一次,每次2-10W条数据,字段的话,不到200个字段,使用的 jdbc sink写入。

九师兄 836

YOLOv8/v9工业零件缺陷检测实战指南:从原理到产线部署

摘要:本文系统介绍基于YOLOv8/v9的工业零件缺陷检测技术,从工业质检背景与需求出发,详解缺陷检测原理、算法构建与模型训练,提供从数据集准备到移动端部署的全流程实操方案。包含多尺度检测、纹理分析等高级技术,适配工业相机的环境优化策略,以及完整质检系统代码实现。适合工业视觉领域新手与进阶开发者,助力快速构建高鲁棒性的缺陷检测系统。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1307

jxls多sheet导出

使用jxls实现公用一个模板文件,导出包含多个sheet的Excel。   导出的Excel中包含三个sheet:Table,View,Sequence public void exportCompareResult(){ XLSTransformer transformer = new XLSTransformer(); // 模板输入流 InputStream in = Ge...

furt_86的博客 1251

数据本体论如何指导数仓建模?

数据本体论指导数仓建模的核心在于构建业务语义与数据结构的桥梁。该方法从业务域中抽象标准化知识体系,包含核心概念、属性、关系和规则五大要素,并将其映射为分层数仓模型。通过"业务本体梳理→本体建模→模型映射→治理迭代"的流程,实现数仓从"结构存储"到"语义载体"的升级。相比传统建模,该方法能解决语义不一致、跨域融合难等问题,使数仓具备更好的可扩展性和业务对齐性。实践表明,以数据本体论为指导的数仓建模能显著提升数据资产的可理解性和复用价值。

石榴姐yyds 396

excel导出列表数据

1.编写js脚本export.js 2.编写Java后台导出工具类 ExportExcel.java 3.Controller里编写方法,处理导出请求 4.jsp页面调用

北海之灵的博客 2591

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

简单的导出excel

response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition","attachment;filename=CallBackRecords.xls" ); 表格的内容 上面的内容是一个jsp文件中,通过上述方式,可以从一个servelt转发到该js...

点点滴滴 159

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ftl方式导出excel

为什么80%的码农都做不了架构师?>>> ...

weixin_34013044的博客 1486

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jsp里的table导出为excel

package com.itiptop.jxl; import java.io.BufferedOutputStream; import java.io.OutputStream; import java.util.Calendar; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jxl.Workbook; import jxl.writ

小小的祈祷的专栏 4749

springboot整合jxl导出

注:本案例是写在单元测试中 创建数据库sql /* Navicat MySQL Data Transfer Source Server : 我的连接 Source Server Version : 50717 Source Host : 127.1.1.1:3306 Source Database : mybatis Target Server Type : MYSQL Target Server Version : 50717 File Encod

weixin_44805174的博客 673

java excel导出html_java读取Excel导出Html对应的table代码

package jxl.bp;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import jxl.Cell;import jxl.Range;import jxl.Sheet;import jxl.W...

weixin_29513663的博客 271

table表导出到excel的两种办法

在web开发中经常需要将页面上的表中的数据导出到excel表,或生成excel表,本人在开发中使用过两种方法: 方法一:     在客户端使用js脚本,使用window的ActiveX技术,所以仅限用于.net平台,需要在浏览器设置activeX相关的支持,但操作很简单,只需要调用下面这个方法即可。有个缺点是:如果有分页的话,而且使用的是真分页,得到的可能是当前的分页数据。 代码

有 prepare , No out 2307

JTable 导出 Excel 利用 jxl.jar

/* * 注明出处!! *QQ: 409323911 */ package com.db.report; import java.io.File; import java.io.FileNotFoundException; import java.util.logging.Level; import java.util.logging.Logger; impo...

213

struts2中将jsp table中的数据导出到excel表格中

struts2中将jsp table中的数据导出到excel表格中 近日,在做一个练习,将jsp的table中显示的数据导出到excel表格中(数据来自数据库),项目使用SSH框架,jsp页面有一个连接,连接到后台一个action,该action负责把数据写入excel文件。 相关代码如下: //jsp连接 导出数据 //struts2 action配置  <action nam

sunxylove的专栏 3325

将jsp页面的表格通过jxl的方式导出到excel中

最近在做公司销量的统计报表,需要导出功能,在网上找了很久也没找到合适的插件,由于现在的浏览器安全级别越来越高,普通的js导出都需要降低浏览器的安全级别,相对而言用户体验不是很好。于是考虑将页面的table数据通过java jxl导出。主要代码如下: 第一步:将页面表格的数据转换成json字符串 //初始化表格二维数组 var tableArray = new Array(); for(va

qiulinq的专栏 2557

用jxl来实现将数据导出成EXECEL表

开始导入jxl.jar包,前面的数据库连接我就不说了导出表的格式说明IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME =users AND XTYPE=U)DROP TABLE usersGOcreate table users (   userid               int  identity(1,1)   not

ooPGao的专栏 699
上一篇: Java打Tag CvsClient
下一篇: js统计Table单元格实际行列 不用rowSpan colSpan,而用offsetLeft
fireinjava
博客等级 码龄20年 5粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值