Spring Boot--POI导出excel文件下载

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);
			}
		}
	}
}

 

 

 

 

你可能感兴趣的:(spring,boot)