java导出Excel , xml设置表头

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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值