`
zyn010101
  • 浏览: 324530 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

把table表格内容导出为excel

    博客分类:
  • java
阅读更多
 package com.chinahrt.report.export;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

/**根据table的html代码生成excel
 * @param args
 * zyn
 * 2012-12-19 上午11:35:30
 */
public class TableToExcelUtil {

	
	/**
	 * 	
	 * @param sheetName
	 * @param html
	 * @param headNum表头的行数
	 * @throws FileNotFoundException
	 * zyn
	 * 2012-12-21 下午1:44:02
	 */
	public void createExcelFormTable(String sheetName,String html,int headNum) throws FileNotFoundException{
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet(sheetName);
		CellStyle headStyle = this.createHeadStyle(wb);
		CellStyle bodyStyle = this.createBodyStyle(wb);
		FileOutputStream os = new FileOutputStream("c:\\table.xls");
		SAXBuilder sb = new SAXBuilder();
		ByteArrayInputStream is = new ByteArrayInputStream(html.getBytes());
		try {
			org.jdom.Document document = sb.build(is);
			//获取table节点
			Element root = document.getRootElement();
			//获取tr的list
			List<Element> trList = root.getChildren("tr");
			int[][] area = getCellArea(trList);
			//循环创建行
			for(int i=0;i<trList.size();i++){
				HSSFRow row = sheet.createRow(i);
				List<Element> tdList = trList.get(i).getChildren("td");
				//该行td的序号
				int tdIndex = 0;
				for(int ii=0;ii<area[i].length;ii++){
					row.createCell(ii);
					HSSFCell cell = row.getCell(ii);
					//判断是否为表头,使用对应的excel格式
					if(i<headNum){
						cell.setCellStyle(headStyle);
					}else{
						cell.setCellStyle(bodyStyle);
					}
					//如果对应的矩阵数字为1,则和横向前一单元格合并
					if(area[i][ii]==1){
						sheet.addMergedRegion(new CellRangeAddress(i,i,ii-1,ii));
					}else if(area[i][ii]==2){//如果对应的矩阵数字为2,则和纵向的前一单元格合并
						sheet.addMergedRegion(new CellRangeAddress(i-1,i,ii,ii));
					}else{//如果为0,显示td中对应的文字,td序号加1
						cell.setCellValue(this.getInnerText(tdList.get(tdIndex)));
						tdIndex ++;
					}
					
				}
				
			}
				
		wb.write(os);
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 导出excel表格二维数组:0为文字占用格,1为横向被合并格,2为纵向合并格
	 * @param trList
	 * @return
	 * zyn
	 * 2012-12-21 下午1:35:40
	 */
	private int[][] getCellArea(List<Element> trList){
		//获取table单元格矩阵
		Element headtr = trList.get(0);
		List<Element> headTdList = headtr.getChildren("td");
		//每行的未经合并的单元格个数
		int cols = 0;
		for(Element e:headTdList){
			int colspan = Integer.valueOf(null==e.getAttributeValue("colspan")?"0":e.getAttributeValue("colspan"));
			if(colspan==0){
				colspan =1;
			}
			cols += colspan;
		}
		//初始化单元格矩阵
		int[][] area = new int[trList.size()][cols];
		for(int i=0;i<trList.size();i++){
			Element tr = trList.get(i);
			List<Element> tdList = tr.getChildren("td");
			//该行到ii个单元格为止被合并的单元格个数
			int rowColspan = 0;
			for(int ii=0;ii<tdList.size();ii++){
				//本单元格跨度计算前的td数
				int oldIndex = ii+rowColspan;
				Element td = tdList.get(ii);
				int colspan = Integer.valueOf(null==td.getAttributeValue("colspan")?"0":td.getAttributeValue("colspan"));
				//colspan为0或者1证明未合并
				colspan = colspan>1?colspan:1;
				rowColspan += colspan-1;
				//单元格需要被横向合并声明为1
				for(int m=1;m<colspan;m++){
					area[i][oldIndex+m]=1;
				}
				int rowspan = Integer.valueOf(null==td.getAttributeValue("rowspan")?"0":td.getAttributeValue("rowspan"));
				rowspan = rowspan>1?rowspan:1;
				//单元格需要被纵向向合并声明为2
				for(int m=1;m<rowspan;m++){
					area[m+i][oldIndex] = 2;
				}
			}
		}
		/*for(int a=0;a<area.length;a++){
			for(int b =0;b<area[0].length;b++){
				System.out.print(area[a][b]);
			}
			System.out.println("");
		}*/
		return area;
	}
	
	
	/**-
	 * 设置表头样式
	 * @param wb
	 * @return
	 */
	private CellStyle createHeadStyle(Workbook wb){
        CellStyle style = wb.createCellStyle();
		Font headerFont = wb.createFont();
		headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		style.setAlignment(CellStyle.ALIGN_CENTER);
		style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
		style.setFillPattern(CellStyle.SOLID_FOREGROUND);
		style.setFont(headerFont);

        style.setBorderRight(CellStyle.BORDER_THIN);
        style.setRightBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderTop(CellStyle.BORDER_THIN);
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());
        return style;
    }
	
	/**-
	 * 设置表单记录样式
	 * @param wb
	 * @return
	 */
	private CellStyle createBodyStyle(Workbook wb){
        CellStyle style = wb.createCellStyle();
		Font headerFont = wb.createFont();
		headerFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
		style.setAlignment(CellStyle.ALIGN_CENTER);
		style.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
		style.setFillPattern(CellStyle.SOLID_FOREGROUND);
		style.setFont(headerFont);

        style.setBorderRight(CellStyle.BORDER_THIN);
        style.setRightBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderTop(CellStyle.BORDER_THIN);
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());
        return style;
    }
	
	private String getInnerText(Element td){
		String txt = "";
  		if(td.getText()==null || td.getText().equals("")){
		   if(null != td.getChildren()){
		    for(int i=0;i<td.getChildren().size();i++){
			    Element e = (Element)td.getChildren().get(i);
			     txt += getInnerText(e);
    		}
   		}
  		}else{
   	txt = td.getText();
  	}
  	return txt;	}
	
	
	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub
		TableToExcelUtil tu = new TableToExcelUtil();
	//	System.out.println(tu.getInnerHtml(\"<td><a>1</a></td>\"));
		tu.createExcelFormTable("缴费统计", "<table><tr class=\"titlebg\"><td align=\"center\" nowrap=\"nowrap\" rowspan=\"2\" colspan=\"1\">序号</td><td align=\"center\" nowrap=\"nowrap\" rowspan=\"2\" colspan=\"1\">计划</td><td align=\"center\" nowrap=\"nowrap\" rowspan=\"2\" colspan=\"1\">部门名称</td><td align=\"center\" nowrap=\"nowrap\" colspan=\"6\">线上缴费</td><td align=\"center\" nowrap=\"nowrap\" colspan=\"3\">线下缴费</td><td align=\"center\" nowrap=\"nowrap\" rowspan=\"2\" colspan=\"1\">总计</td></tr><tr class=\"titlebg\"><td align=\"center\" nowrap=\"nowrap\">线上总计</td><td align=\"center\" nowrap=\"nowrap\">快钱</td><td align=\"center\" nowrap=\"nowrap\">支付宝</td><td align=\"center\" nowrap=\"nowrap\">平台余款</td><td align=\"center\" nowrap=\"nowrap\">激活卡</td><td align=\"center\" nowrap=\"nowrap\">其他</td><td align=\"center\" nowrap=\"nowrap\">线下总计</td><td align=\"center\" nowrap=\"nowrap\">本地缴费</td><td align=\"center\" nowrap=\"nowrap\">中心收费</td></tr><tr class=\"whbg\" orgPath=\"01.25.01.\" planId=\"9e508516-5409-4b5d-a0d6-f86ba77eb79f\" ><td align=\"center\" nowrap=\"nowrap\">1</td><td align=\"center\" nowrap=\"nowrap\">盐城2013年培训计划</td><td align=\"center\" nowrap=\"nowrap\">盐城市</td><td align=\"center\" nowrap=\"nowrap\">0</td><td align=\"center\" nowrap=\"nowrap\">0</td><td align=\"center\" nowrap=\"nowrap\">0</td><td align=\"center\" nowrap=\"nowrap\">0</td><td align=\"center\" nowrap=\"nowrap\">0</td><td align=\"center\" nowrap=\"nowrap\">0</td><td align=\"center\" nowrap=\"nowrap\"><a id=\"0-12\" href=\"javascript:showDetail('0-12');\">3</a></td><td align=\"center\" nowrap=\"nowrap\">0</td><td align=\"center\" nowrap=\"nowrap\">0</td><td align=\"center\" nowrap=\"nowrap\"><a id=\"0-15\" href=\"javascript:showDetail('0-15');\">3</a></td></tr><tr class=\"whbg\" orgPath=\"all\" planId=\"all\"><td align=\"center\"  nowrap=\"nowrap\" colspan=\"3\" >总计</td><td align=\"center\" nowrap=\"nowrap\" >0</td><td align=\"center\" nowrap=\"nowrap\" >0</td><td align=\"center\" nowrap=\"nowrap\" >0</td><td align=\"center\" nowrap=\"nowrap\" >0</td><td align=\"center\" nowrap=\"nowrap\" >0</td><td align=\"center\" nowrap=\"nowrap\" >0</td><td align=\"center\" nowrap=\"nowrap\" ><a id=\"4-6\" href=\"javascript:showDetail('4-6');\">3</a></td><td align=\"center\" nowrap=\"nowrap\" >0</td><td align=\"center\" nowrap=\"nowrap\" >0</td><td align=\"center\" nowrap=\"nowrap\" ><a id=\"4-9\" href=\"javascript:showDetail('4-9');\">3</a></td></tr></table>", 2);
	}

}

 用jdom解析table的html结构,用poi生成excel,html效果如下:



 


导出的excel效果如下:
 

 

原getCellArea有bug,不能满足同一个单元格既跨行又跨列的情况,修复如下:

private static int[][] getCellArea1(List<Element> trList){
		//获取table单元格矩阵
		Element headtr = trList.get(0);
		List<Element> headTdList = headtr.getChildren("td");
		//每行的未经合并的单元格个数
		int cols = 0;
		for(Element e:headTdList){
			System.out.println("#"+e.getText());
			int colspan = Integer.valueOf(null==e.getAttributeValue("colspan")?"0":e.getAttributeValue("colspan"));
			if(colspan==0){
				colspan =1;
			}
			cols += colspan;
		}
		//初始化单元格矩阵
		int[][] area = new int[trList.size()][cols];
		for(int i=0;i<trList.size();i++){
			Element tr = trList.get(i);
			List<Element> tdList = tr.getChildren("td");
	
			for(int ii=0,tdIndex=0;ii<cols;ii++){
				//如果大于0,表明已经处理过,不需再处理
				if(area[i][ii]>0){
					continue;
				}
				Element td = tdList.get(tdIndex);
				int colspan = Integer.valueOf(null==td.getAttributeValue("colspan")?"0":td.getAttributeValue("colspan"));
				colspan = colspan>1?colspan:1;
				//单元格需要被横向合并声明为1
				for(int m=1;m<colspan;m++){
					area[i][ii+m]=1;
				}
				int rowspan = Integer.valueOf(null==td.getAttributeValue("rowspan")?"0":td.getAttributeValue("rowspan"));
				rowspan = rowspan>1?rowspan:1;
				//单元格需要被纵向向合并声明为2
				for(int m=1;m<rowspan;m++){
					area[m+i][ii] = 2;
				}
				//列和行都有跨度的区域,把第一行,第一列外的区域置为2
				if(colspan>1 && rowspan>1){
					for(int j=1;j<rowspan;j++){
						for(int k=1;k<colspan;k++){
							area[i+j][ii+k]=2;
						}
					}
				}
				tdIndex ++;
			}
		}
		return area;
	}

 

  • 大小: 27.2 KB
  • 大小: 32.8 KB
0
1
分享到:
评论
1 楼 baobaodehao1991 2018-01-03  
楼主,合并多列,单元格内容并不能居中,选中合并的单元格,除了前两列,其他合并的列都是灰色的。楼主知道啥原因吗,谢谢。

相关推荐

    table表格导出为excel

    通过以上介绍,我们可以看出,将table表格导出为excel是网页开发中的一个重要功能,它涉及前端和后端技术,以及对数据处理和用户体验的理解。在实际项目中,开发者需要根据具体需求和环境选择合适的工具和方法来实现...

    将网页table表格中导出到Excel表格中

    用Javascript实现的将网页table中的数据导出到excel表格中!JSP ASP.NET 静态页面都可以使用!代码简单实用!

    tableExport_html表格导出excel等多种格式

    "tableExport_html表格导出excel等多种格式"是一个便捷的工具,它允许用户将HTML表格的数据轻松地导出为Excel、CSV、PDF等格式。这个工具通过引入一个JavaScript库,大大简化了这个过程,使得网页开发者和非技术人员...

    用jquery-table2excel,进行导出excel表格 带图片 jquery.table2excel.js下载

    总的来说,`jquery-table2excel`是一个实用的前端工具,它简化了从HTML表格导出到Excel的过程,尤其适合需要快速实现这一功能的小型项目。然而,对于更复杂的需求,例如大量数据处理、服务器端导出、高级样式保持等...

    table表格导出到excel

    在网页中,将HTML表格的数据导出到Excel文件是一种常见的需求,这可以帮助用户方便地管理和分析数据。在给定的场景中,我们主要涉及到的技术包括HTML、JavaScript(JS)、以及可能用于服务器端处理的Java(jsp)。...

    layui数据表格导出Excel插件

    layui数据表格导出Excel插件是一款为layui框架设计的实用工具,它允许用户方便地将layui数据表格中的数据导出到Excel文件中。layui是一款轻量级的前端UI框架,以其简洁、优雅的代码风格和丰富的组件库深受开发者喜爱...

    前端页面导出table中的内容到excel

    通过以上技术,开发者可以在前端页面上实现将table表格数据导出为Excel的功能,提供用户友好的数据交互体验。在实际项目中,结合具体的业务需求和现有技术栈,选择合适的方法和库,可以高效地完成这一任务。

    解决tableExport导出到excel中文乱码

    解决tableExport导出到excel中文乱码,解决tableExport导出到excel中文乱码,解决tableExport导出到excel中文乱码,解决tableExport导出到excel中文乱码

    Table表格导出为Excel、csv、txt、sql、json、xml、Word格式

    本项目提供的"Table表格导出为Excel、csv、txt、sql、json、xml、Word格式"就是这样一个功能丰富的解决方案,它允许用户将网页中的表格数据方便地转换为多种常见格式。 首先,我们来详细了解一下这些文件格式的特点...

    Ligerui Table导出excel 支持样式、冻结行列、图片等导出

    LigerUI Table不仅具备基本的表格功能,如排序、筛选、分页,还提供了丰富的扩展特性,如导出Excel功能。这个功能使得用户能够方便地将网页上的数据导出到Excel文件中,以便于进一步的数据分析或存储。 标题"...

    html表格导出为excel

    "HTML表格导出为Excel"就是一种常见的需求,它允许用户将展示在网页上的结构化数据,如表格,轻松地下载为Excel文件,便于进一步处理或分析。在这个过程中,我们通常会利用JavaScript库,比如jQuery,来实现这一功能...

    前端导出Excel table2excel

    "前端导出Excel table2excel"就是这样一个解决方案,它实现了在浏览器端将HTML表格直接转换为Excel文件,实现了“所见即所得”的效果。这个功能对于数据展示和分析非常有用,比如用户可以在查看完网页上的数据后,...

    js操作table导出excel

    总结,JavaScript操作HTML表格导出Excel主要涉及以下几个步骤: 1. 引入`FileSaver.js`库。 2. 创建HTML表格并填充数据。 3. 使用JavaScript获取表格数据并转换为CSV格式。 4. 创建Blob对象,并使用`saveAs`方法保存...

    h5 列表导出为excel

    在IT领域,尤其是在Web开发中,常常需要将HTML5(H5)页面中的表格数据导出为Excel格式,以便用户可以方便地存储、编辑或分享数据。"h5 列表导出为excel"这个话题涉及到的技术点主要包括HTML5、JavaScript、CSS以及...

    table转Excel,可导出图片,亲测有效

    javascript代码可以将HTML的table表格转换成excel表格。var table = document.getElementById("table")[removed]; export2Excel(table, '导出.xls');

    页面html Table表格导出Execl

    "页面html Table表格导出Execl"这个主题涉及的技术点主要包括HTML表格的处理、JavaScript(或者jQuery)用于前端交互、以及可能涉及的后端处理和文件下载技术。下面我们将详细探讨这些知识点。 1. **HTML表格...

    jquery.table2excel.js(用于table导出Excel文件)

    之后,你可以通过以下步骤来实现表格导出: 1. **引入插件**:在HTML文件中,添加对`jquery.table2excel.js`的引用。通常,这需要放置在`&lt;head&gt;`标签或者`&lt;body&gt;`标签底部的`&lt;script&gt;`标签内。 ```html ...

    【JavaScript源代码】纯JS将table表格导出到excel的方法.docx

    以下是如何使用纯JavaScript实现这个功能的详细步骤和方法。...以上就是纯JavaScript将table表格导出到Excel的基本原理和方法,实际应用中可能需要根据具体需求进行调整,例如添加样式支持、错误处理、兼容性优化等。

    html中table表格导出Excel示例(亲测可用)

    在网页开发中,有时我们需要将HTML中的表格数据导出到Excel文件中,以便用户可以方便地进行数据分析或存储。这个示例就是关于如何在前端实现这一功能,无需借助后端接口,只用HTML、jQuery和JavaScript技术。我们将...

    jquery表格table导出下载成

    该插件可以将Html的表格导出成为 JSON, XML, CSV, TSV, TXT, SQL, Word, Excel, PNG and PDF格式,支持的导出格式还是挺多的,基本能满足自己的需求。 因为github上作者给出的插件的使用描述已经很详细了,我就不在...

Global site tag (gtag.js) - Google Analytics