1. 依赖
org.apache.poi
poi
3.16
org.apache.poi
poi-ooxml
3.16
org.apache.poi
poi-scratchpad
3.16
com.google.code.gson
gson
2. 代码
2.1 写入excel
/**
* 导出excel
* @param list 数据集合
* @param column 列名
* @param templatePath 模板路径
* @param os 输出流
*/
public static void exportExcel(List list, String[] column, String templatePath, OutputStream os) {
// 获取列名map
Map map = XmlParser.getColumnName(templatePath);
// 声明一个工作薄
HSSFWorkbook wb = new HSSFWorkbook();
// 声明一个单子并命名
HSSFSheet sheet = wb.createSheet("1");
// 给单子名称一个长度
sheet.setDefaultColumnWidth((short) 15);
// 生成一个样式
HSSFCellStyle style = wb.createCellStyle();
// 创建第一行(也可以称为表头)
HSSFRow row = sheet.createRow(0);
// 样式字体居中
style.setAlignment(HorizontalAlignment.CENTER);
// 给表头第一行一次创建单元格
if (column == null || column.length == 0)
return ;
for (int index = 0; index < column.length; index++) {
HSSFCell cell = row.createCell((short) index);
// 名称..
cell.setCellValue(map.get(column[index]));
cell.setCellStyle(style);
}
// 将集合转成list
// 有可能报错,json序列化死循环
JSONArray jsonarray = JSONArray.fromObject(list);
// 向单元格里填充数据
for (short i = 0; i < jsonarray.size(); i++) {
row = sheet.createRow(i + 1);
JSONObject jsonObject = jsonarray.getJSONObject(i);
for (int index = 0; index < column.length; index++) {
row.createCell(index).setCellValue(jsonObject.get(column[index]) + "");
}
}
try {
wb.write(os);
System.out.println("导出成功");
wb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2.2 控制层调用
/**
* 下载
*
* @throws IOException
*/
@RequestMapping("/export")
public void export(String templatePath,
HttpServletResponse response) throws IOException {
// 查询所有的数据
List findAll = studentService.findAll();
String[] str = { "id", "name"};//列名
// 写入文件,得到文件
Date date = new Date(System.currentTimeMillis());
// 转换提日期输出格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String name = dateFormat.format(date) + ".xls";
response.addHeader("Content-Disposition",
"attachment;filename=" + new String(name.getBytes("UTF-8"), "ISO8859-1"));
response.setContentType("application/octet-stream");
OutputStream toClient = null;
toClient = new BufferedOutputStream(response.getOutputStream());
ExcelUtil.exportExcel(findAll, str, templatePath, response.getOutputStream());
toClient.flush();
response.getOutputStream().close();
}
2.3 XmlParse类
/**
* Java递归遍历XML中对应表中列关系
*
* @author 春风吹又生
*/
@SuppressWarnings("all")
public class XmlParser {
/**
* XML文件路径
*/
private String XMLPath = null;
/**
* XML文档
*/
private Document document = null;
/**
* 存储xml元素信息的容器
*/
private List tableInfoList = new ArrayList();
protected Logger logger = LoggerFactory.getLogger(getClass());
public XmlParser() {
}
/**
* 初始化xml文件
*
* @param XMLPath
* 文件路径
*/
public XmlParser(String XMLPath) {
this.XMLPath = XMLPath;
}
/**
* 打开文档
*/
public void openXML() {
try {
SAXReader reader = new SAXReader();
this.document = reader.read(this.XMLPath);
logger.info("openXML() successful ...");
} catch (Exception e) {
logger.error("openXML() Exception:" + e.getMessage());
}
}
/**
* 打开文档
*
* @param filePath
* 文档路径
* @return Document xml文件
*/
public Document openXML(String filePath) {
try {
SAXReader saxReader = new SAXReader();
this.document = saxReader.read(filePath);
logger.info("打开xml文档:" + filePath + " 成功 ...");
return document;
} catch (Exception e) {
logger.error("打开xml文档:" + filePath + " Exception:" + e.getMessage());
}
return null;
}
/**
* 读取xml文件,返回List
*
* @param filePath
* 文档路径
* @return List 文档的节点信息
*/
public List readXml(String filePath) {
// 读取XML文件,并得到文档document对象
openXML(filePath);
Element root = document.getRootElement(); // 得到文档根结点
List list = root.elements();
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Element object = (Element) iterator.next();
// 如果当前节点的名字为tableName,则生成一个tableInfo信息
if (object.getName().equals("tableName")) {
TableInfo tinfo = new TableInfo();
// 设置表的表明,然后遍历当前表的所有字段
tinfo.setTableName(object.attribute("name").getStringValue());
this.getElementList(object, tinfo);
tableInfoList.add(tinfo);
} else {
continue;
}
}
return this.tableInfoList;
}
/**
* 递归遍历方法 <功能详细描述>
*
* @param element
* 某一个节点开始遍历
*/
public void getElementList(Element element, TableInfo tinfo) {
List elements = element.elements();
// 对于node结点直接操作
if ("node".equals(element.getName())) {
String ename = element.element("ename").getStringValue();
String tname = element.element("tname").getStringValue();
String typeValue = element.element("typeValue").getStringValue();
Element ref = element.element("ref");
if (ref != null) {
String refValue = ref.getText();
tinfo.getList().add(new Node(ename, tname, typeValue, refValue));
} else {
tinfo.getList().add(new Node(ename, tname, typeValue));
}
// 对当前表信息添加字段
} else {
// 当前节点不是node结点,递归(?)
// 代表当前节点为tableName,递归其表字段
Iterator it = elements.iterator();
while (it.hasNext()) {
Element elem = (Element) it.next();
// 递归遍历
getElementList(elem, tinfo);
}
}
}
/**
* 获取节点所有属性值 <功能详细描述>
*
* @param element
* @return
* @see [类、类#方法、类#成员]
*/
public String getNoteAttribute(Element element) {
String xattribute = "";
DefaultAttribute e = null;
List list = element.attributes();
for (int i = 0; i < list.size(); i++) {
e = (DefaultAttribute) list.get(i);
xattribute = e.getText();
}
return xattribute;
}
/**
* 得到节点属性
*
* @param nodeName
* @return
*/
public String getNoteAttribute(String nodeName) {
Element root = document.getRootElement();
for (Iterator iter = root.elementIterator(); iter.hasNext();) {
Element element = (Element) iter.next();
if (nodeName.equals(element.getName())) {
return getNoteAttribute(element);
}
}
return null;
}
/**
* 解析xml,得到列名
*
* @param path
* @return
*/
public static Map getColumnName(String path) {
try {
Document document = XMLUtils.getDocument(path);
Element root = document.getRootElement(); // 得到文档根结点
List list = root.elements();
Iterator iterator = list.iterator();
Map columnMap = new HashMap();
while (iterator.hasNext()) {
Element object = (Element) iterator.next();
// 如果当前节点的名字为tableName,则生成一个tableInfo信息
if (object.getName().equals("tableName")) {
// 设置表名,然后遍历当前表的所有字段
getElementMap(object, columnMap);
} else {
continue;
}
}
return columnMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static void getElementMap(Element element, Map columnMap) {
List elements = element.elements();
// 对于node结点直接操作
if ("node".equals(element.getName())) {
String ename = element.element("ename").getStringValue();
String tname = element.element("tname").getStringValue();
String typeValue = element.element("typeValue").getStringValue();
Element ref = element.element("ref");
columnMap.put(tname, ename);
// 对当前表信息添加字段
} else {
// 当前节点不是node结点,递归(?)
// 代表当前节点为tableName,递归其表字段
Iterator it = elements.iterator();
while (it.hasNext()) {
Element elem = (Element) it.next();
// 递归遍历
getElementMap(elem, columnMap);
}
}
}
}