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

java导出Excel , xml设置表头

    博客分类:
  • Java
阅读更多
import java.sql.SQLException;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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;

public class Excel {

	private HSSFWorkbook wb = null;

	private HSSFSheet sheet = null;

	private HSSFRow row = null;

	private HSSFCell cell = null;

	private HSSFCellStyle titleStyle = null;

	private HSSFCellStyle headStyle = null;

	private HSSFCellStyle bodyStyle = null;

	private int num = 0;
	
	private int headLength = 0;

	public Excel() {
		wb = new HSSFWorkbook();
		sheet = wb.createSheet();
		sheet.setDefaultColumnWidth(14);
		sheet.setDefaultRowHeight((short)20);
		//打印设置 
		HSSFPrintSetup hps = sheet.getPrintSetup(); 
		hps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); // 设置A4纸 
		hps.setLandscape(true); // 将页面设置为横向打印模式 
//		sheet.setHorizontallyCenter(true); // 设置打印页面为水平居中 
//		sheet.setVerticallyCenter(true); // 设置打印页面为垂直居中
		//冻结第一行和第二行
		sheet.createFreezePane( 0, 2, 0, 2 );

		
		init();
	}
	
	/**
	 * 初始化样式
	 */
	private void init() {
		titleFont();
		headFont();
		bodyFont();
	}

	/**
	 * 设置标题样式
	 * 
	 */
	private void titleFont() {
		HSSFFont titleFont = wb.createFont();
		titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		titleFont.setFontName("宋体");
		titleFont.setFontHeightInPoints((short) 18);
		titleStyle = wb.createCellStyle();
		titleStyle.setFont(titleFont);
//		titleStyle.setBorderTop((short)1);
//		titleStyle.setBorderRight((short)1);
		titleStyle.setBorderBottom((short)1);
//		titleStyle.setBorderLeft((short)1);
		
		titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

	}

	/**
	 * 设置head样式
	 * 
	 */
	private void headFont() {

		HSSFFont headFont = wb.createFont();
		headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		headFont.setFontName("宋体");
		headFont.setFontHeightInPoints((short) 11);
		headStyle = wb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setBorderTop((short)1);
		headStyle.setBorderRight((short)1);
		headStyle.setBorderBottom((short)1);
		headStyle.setBorderLeft((short)1);
		headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
	}

	/**
	 * 设置body样式
	 * 
	 */
	private void bodyFont() {
		HSSFFont bodyFont = wb.createFont();
		bodyFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
		bodyFont.setFontName("宋体");
		bodyFont.setFontHeightInPoints((short) 9);
		bodyStyle = wb.createCellStyle();
		bodyStyle.setFont(bodyFont);
		bodyStyle.setBorderTop((short)1);
		bodyStyle.setBorderRight((short)1);
		bodyStyle.setBorderBottom((short)1);
		bodyStyle.setBorderLeft((short)1);
		bodyStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		bodyStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
	}
	
	/**
	 * 生成Excel主方法
	 * @param xml :包括title和head的内容和设置
	 * @param list :内容 
	 * @param fit :是否需要宽度自适应
	 * @return HSSFWorkbook
	 * @throws SQLException
	 */
	public HSSFWorkbook createWorkBook(final ExcelHeadXML xml, final List<Object[]> list, boolean fit) throws SQLException {
		createTop(xml);
		/*
		List<Object[]> list1 = new LinkedList<Object[]>();
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		list1.add(new Object[]{"000003","武汉市XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX公司","XXXXXX","VVVVVVVV","dddd","23","2009-04-04"});
		createBody(list1,true);
		*/
		createBody(list,true);
		//宽度自适应
		if(fit){
			for(int i=0; i<headLength; i++){
				sheet.autoSizeColumn(i); 
			}
		}
		return wb;
	}
	
	/**
	 * 生成Excel主方法
	 * @param xml :包括title和head的内容和设置
	 * @param list :内容 
	 * @param fit :是否需要宽度自适应
	 * @return HSSFWorkbook
	 * @throws SQLException
	 */
	public HSSFWorkbook createWorkBook(final ExcelHeadXML xml,HttpServletRequest request, final List<Object[]> list, boolean fit) throws SQLException {
		createTop(xml,request);
		createBody(list,true);
		//宽度自适应
		if(fit){
			for(int i=0; i<headLength; i++){
				sheet.autoSizeColumn(i); 
			}
		}
		return wb;
	}
	
	/**
	 * 创建Excel的Head和title部分
	 * @param xml ExcelHeadXML
	 */
	@SuppressWarnings("deprecation")
	private void createTop(final ExcelHeadXML xml,HttpServletRequest request) {
		//创建Title部分
		if (null != xml.getTitle() && !"".equals(xml.getTitle())) {
			row = sheet.createRow(num++);
			cell = row.createCell(0);
			cell.setCellStyle(titleStyle);
			sheet.addMergedRegion(new CellRangeAddress(xml.getUniteRowStart(),
					xml.getUniteRowEnd(), xml.getUniteCellStart(), xml
							.getUniteRowCount()));
			
		}
		//创建Head部分
		List<String> head = xml.getHead();
		if(null != head && head.size() > 0){
			headLength = xml.getHeadLength();
			row = sheet.createRow(num++);
			for(int i=0; i<head.size(); i++){
				cell = row.createCell(i);
				cell.setCellStyle(headStyle);
				cell.setCellValue(new HSSFRichTextString(head.get(i)));
				
			}
		}
	}
	
	
	/**
	 * 创建Excel的Head和title部分
	 * @param xml ExcelHeadXML
	 */
	@SuppressWarnings("deprecation")
	private void createTop(final ExcelHeadXML xml) {
		//创建Title部分
		if (null != xml.getTitle() && !"".equals(xml.getTitle())) {
			row = sheet.createRow(num++);
			cell = row.createCell(0);
			cell.setCellStyle(titleStyle);
			cell.setCellValue(new HSSFRichTextString(xml.getTitle().trim()));
			sheet.addMergedRegion(new CellRangeAddress(xml.getUniteRowStart(),
					xml.getUniteRowEnd(), xml.getUniteCellStart(), xml
							.getUniteRowCount()));
			
		}
		//创建Head部分
		List<String> head = xml.getHead();
		if(null != head && head.size() > 0){
			headLength = xml.getHeadLength();
			row = sheet.createRow(num++);
			for(int i=0; i<head.size(); i++){
				cell = row.createCell(i);
				cell.setCellStyle(headStyle);
				cell.setCellValue(new HSSFRichTextString(head.get(i)));
				
			}
		}
	}
	/**
	 * 创建Excel的body部分
	 * @param list : body部分的数据
	 * @param useId : body部分是否要序号
	 * @throws SQLException 
	 */
	private void createBody(final List<Object[]> list, boolean useId) throws SQLException {
		if(null != list && list.size() > 0){
			Object[] o;
			
			for(int i=0; i<list.size(); i++){
				row = sheet.createRow(num++);
				row.setHeightInPoints(30);
				o = list.get(i);
				if(useId){
					//序号
					cell = row.createCell(0);
					cell.setCellStyle(bodyStyle);
					cell.setCellValue(new HSSFRichTextString((i+1)+""));
					
				}
				for(int j=0; j<o.length; j++){
					if(useId){
						cell = row.createCell(j+1);
					}else{
						cell = row.createCell(j);
					}
					cell.setCellStyle(bodyStyle);
					cell.setCellValue(new HSSFRichTextString(emptyToString(o[j])));
					
				}
			}
		}
	}

	public String emptyToString(Object obj){
		if(null == obj){
			return "";
		}
		return obj.toString().trim();
	}
	
}


读取xml文件,excel的头信息保存在xml中
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class ExcelHeadXML {
	/** Excel的标题 */
	private String title = "";

	/** Excel的头 */
	private List<String> head = null;

	/** 合并单元格时开始的行 */
	private int uniteRowStart = 0;

	/** 合并单元格时结尾的行 */
	private int uniteRowEnd = 0;

	/** 合并单元格需要合并的列数数量 */
	private int uniteRowCount = 0;

	/** 合并单元格时开始的列 */
	private int uniteCellStart = 0;

	private DocumentBuilderFactory dbf = null;

	private DocumentBuilder db = null;

	private Document doc = null;

	private Element root = null;
	
	private int headLength = 0;
	
	/**
	 * 构造函数,同时解析XML
	 * @param filePath : XML的路径
	 */
	public ExcelHeadXML(String fileName) {
		/** 为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder */
		dbf = DocumentBuilderFactory.newInstance();
		try {
			db = dbf.newDocumentBuilder();
			doc = db.parse(new File(ExcelHeadXML.class.getResource(fileName).getPath()));
			root = doc.getDocumentElement();
			parseTitles();
			parseHeads();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	 

	/**
	 * 解析XML中的title部分
	 * 解析title的内容
	 * 解析行的开始位置
	 * 解析行的结束位置
	 * 解析列的开始位置
	 * 解析合并单元格的列的数量
	 */
	private void parseTitles() {
		NodeList titles = root.getElementsByTagName("title");
		for (int i = 0; i < titles.getLength(); i++) {
			uniteRowStart = Integer.parseInt(titles.item(i).getAttributes()
					.getNamedItem("uniteRowStart").getNodeValue());
			uniteRowEnd = Integer.parseInt(titles.item(i).getAttributes()
					.getNamedItem("uniteRowEnd").getNodeValue());
			uniteRowCount = Integer.parseInt(titles.item(i).getAttributes()
					.getNamedItem("uniteRowCount").getNodeValue());
			uniteCellStart = Integer.parseInt(titles.item(i).getAttributes()
					.getNamedItem("uniteCellStart").getNodeValue());
			title = titles.item(i).getFirstChild().getNodeValue();
			
		}
	}
	/**
	 * 解析head部分,将head的内容保存到集合中
	 *
	 */
	private void parseHeads() {
		head = new ArrayList<String>();
		NodeList heads = root.getElementsByTagName("colum");
		for(int i=0; i<heads.getLength(); i++){
			head.add(heads.item(i).getFirstChild().getNodeValue());
			headLength++;
		}
		
	}

	public static void main(String[] args) {
		ExcelHeadXML x = new ExcelHeadXML("1.xml");
//		System.out.println(x.getPath());
//		x.getHeads();
	}
	
	/**
	 * title的内容
	 * @return
	 */
	public String getTitle() {
		return title;
	}
	/**
	 * 设置title内容
	 * @param title
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	public int getUniteRowCount() {
		return uniteRowCount;
	}

	public void setUniteRowCount(int uniteRowCount) {
		this.uniteRowCount = uniteRowCount;
	}

	public int getUniteRowEnd() {
		return uniteRowEnd;
	}

	public void setUniteRowEnd(int uniteRowEnd) {
		this.uniteRowEnd = uniteRowEnd;
	}

	public int getUniteRowStart() {
		return uniteRowStart;
	}

	public void setUniteRowStart(int uniteRowStart) {
		this.uniteRowStart = uniteRowStart;
	}
	
	/**
	 * head的集合
	 * @return
	 */
	public List<String> getHead() {
		return head;
	}

	public void setHead(List<String> head) {
		this.head = head;
	}

	public int getUniteCellStart() {
		return uniteCellStart;
	}

	public void setUniteCellStart(int uniteCellStart) {
		this.uniteCellStart = uniteCellStart;
	}
	/**
	 * head部分的长度
	 * @return head部分的长度
	 */
	public int getHeadLength(){
		return this.headLength;
	}

	

}

xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<xml-body>

	<title uniteRowStart="0" uniteRowEnd="0" uniteRowCount="10" uniteCellStart="0">
			XXXXXXXX
	</title>
	
	
	<head>
		<colum>aa</colum>
		<colum>bb</colum>
		<colum>cc</colum>
		<colum>dd</colum>
		<colum>ee</colum>
		<colum>ff</colum>
		<colum>gg</colum>
		<colum>hh</colum>
		<colum>jj</colum>
		<colum>kk</colum>
		<colum>ll</colum>
	</head>

</xml-body>
分享到:
评论
2 楼 a21703637a 2011-12-08  
1 楼 对酒当歌,人生几何 2009-11-17   引用
对酒当歌,人生几何 写道
能处理多大的文件?30M?40M可以吗?最近做一个导出,文件大小有30多M,一直报内存溢出,数据少了还可以。郁闷呢~~~~~~~~~~~~~~~~~

   可以分开导出然后再写个文件合并类么哈哈
1 楼 对酒当歌,人生几何 2009-11-17  
能处理多大的文件?30M?40M可以吗?最近做一个导出,文件大小有30多M,一直报内存溢出,数据少了还可以。郁闷呢~~~~~~~~~~~~~~~~~

相关推荐

    java实现导出Excel多行表头复杂模板

    在Java中实现导出Excel多行表头的复杂模板,通常会使用Apache POI库,这是一个强大的API,专为操作Microsoft Office格式的文件而设计,尤其是处理Excel(.xlsx和.xls)文件。以下是对这个主题的详细解释: **Apache...

    Java导出Excel文件(97--2003)

    在Java编程环境中,导出Excel文件是常见的需求,特别是在数据处理、报表生成或者数据分析的场景。本示例主要关注如何使用Java来创建适用于97-2003版Microsoft Excel的文件,这些文件通常以`.xls`为扩展名。这个版本...

    POI的EXCEL导出,自动换行

    通过以上步骤,我们成功地实现了使用Apache POI在Java中导出Excel文件,并实现了自动换行的功能。这种方式不仅可以提高工作效率,还能确保数据的准确性和完整性。 #### 六、注意事项与优化建议 - **兼容性问题**:...

    导出excel注解方式

    在Java编程中,导出Excel是一项常见的数据处理任务,尤其在数据分析、报表生成等领域中广泛应用。本教程将探讨如何利用注解方式实现简单的Excel表格导出功能。这种方法通常结合Java库,如Apache POI,来简化操作流程...

    java导出excel文档通用工具类

    "java导出excel文档通用工具类"正是这样一个工具,它允许我们灵活地生成包含表头的Excel文件,提高开发效率。 Java中导出Excel主要依赖于Apache POI库,这是一个用于读写Microsoft Office格式档案的Java API。...

    java 导出 excel

    在Java编程中,导出...总之,Java导出Excel涉及到的内容广泛,从选择合适的库到处理各种复杂需求,都需要开发者具备扎实的编程基础和对Excel文件格式的理解。通过不断实践和学习,你可以轻松应对各种Excel处理任务。

    java导出excel所需jar

    在Java开发中,导出Excel是一项常见的需求,用于数据的导出和报表生成。Apache POI是一个流行的开源库,专门用于处理Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。本篇将深入探讨如何使用Java和Apache ...

    java 导出 excel 工作表 实例

    以下是一个简单的Java导出Excel工作表的实例: 首先,确保在项目中添加Apache POI依赖。如果你使用Maven,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi &lt;version&gt;4.1.2 ...

    java实现excel导出所需要的jar

    在Java编程中,导出Excel文件是一项常见的任务,特别是在数据处理、报表生成和数据分析等领域。为了实现在Java中导出Excel,我们需要引入特定的库,这些库提供了方便的API来操作Excel文件。"java实现excel导出所需要...

    AdvancedDataGrid多层分组表头导出Excel与后台JAVA交互

    本篇文章将深入探讨如何实现AdvancedDataGrid的多层分组表头导出到Excel,并与后台JAVA进行交互。 首先,多层分组表头是指在数据网格的列标题部分可以有层次结构的展示,这种设计可以帮助用户更清晰地理解数据之间...

    java 导出到EXCEL 代码

    在Java编程中,导出数据到Excel是一种常见的需求,特别是在数据处理、报表生成或数据分析的场景下。这个“java 导出到EXCEL 代码”示例提供了方便且易用的方法,使得开发者只需要编写SQL查询语句并设定Excel的列名...

    演示通过easyExcel来导出excel数据

    总结起来,SpringBoot结合EasyExcel可以轻松地实现在Java应用中导出Excel数据。EasyExcel的易用性和高性能使其成为处理大量数据导出的理想选择。只需简单几步,开发者就能构建出满足业务需求的Excel导出功能。

    java-excel导入导出注解版内用教程说明

    1. **导出Excel** 创建一个实体类,例如 `Student`,并使用注解来标记Excel的列名和数据类型: ```java public class Student { @ExcelCell(title = "姓名", order = 1) private String name; @ExcelCell...

    java使用 POI Excel模板导出数据

    这篇博客"java使用POI Excel模板导出数据"探讨了如何利用POI库在Java中创建Excel模板并填充数据。下面将详细介绍这个过程以及相关知识点。 首先,我们需要理解Apache POI的基本概念。POI是Apache软件基金会的一个...

    java导入excel表格

    5. **导出Excel** 如果需要将处理后的数据保存回Excel文件,可以创建一个新的工作簿和工作表,然后填充数据: ```java XSSFWorkbook newWorkbook = new XSSFWorkbook(); XSSFSheet newSheet = newWorkbook....

    java工程(非web)导出excel

    在Java开发中,导出Excel是一项常见的需求,尤其在非Web环境下,可能涉及到数据报表的生成或者数据备份。本文将详细讲解如何在Java工程中实现非Web应用的Excel导出功能,参考的文章链接为:...

    POI使用Excel模板文件循环输出行并导出Excel

    在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,我们需要理解POI库的基本概念。POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF...

    java 导出到excel

    Java导出到Excel是一项常见的需求,特别是在数据处理和报表生成的场景中。Java提供了多种库来实现这个功能,其中最常用的可能是Apache POI库。Apache POI是一个开源项目,允许Java程序读写Microsoft Office格式的...

    编程语言java导出excel代码.pdf

    本文主要围绕Java编程语言导出Excel文件的代码实现进行了阐述,涵盖了从Java Servlet页面构建到Apache POI库使用,再到导出Excel文件的具体步骤。通过本文内容,我们可以了解到如何使用Java语言结合JSP(Java Server...

    详解JAVA_POI导出EXCEL报表的操作(包括各种格式及样式的实现)

    ### JAVA POI 导出 EXCEL 报表的操作详解(含格式及样式实现) #### 一、概述 在日常工作中,我们经常会遇到需要将数据导出到 Excel 的情况,尤其是在处理大量的报表数据时。Java POI 库为 Java 开发者提供了一种...

Global site tag (gtag.js) - Google Analytics