WEB中以cvs格式导出数据

实例为SSH项目,县公司导出售后报表的DEMO,先要导入jxl.jar:
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.List;

import jxl.Workbook;
import jxl.format.Colour;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**
 * 导出文件工具类
 */
public class ExportUtil {

	/**
	 * 创建TXT或者CSV文件
	 * 
	 * @param list 查询出的结果
	 * @param head 表头
	 * @param proerty 需要导出的列(与head对应)
	 * @param fileName 文件名
	 * @return
	 * @throws Exception
	 */
	
	public static File createTxtFile(List list, List<String> head, List<String> proerty, String fileName) throws Exception {
		File file = new File(fileName);
		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));

		StringBuilder sb = new StringBuilder();
		for (String str : head) {
			sb.append("\t" + str + ",");
		}
		sb.append("\r\n");
		Long row = 0L;
		for (Object obj : list) {
			Class className = obj.getClass();
			// 反射所有字段
			@SuppressWarnings("unused")
			Field[] fields = className.getDeclaredFields();

			for (String str : proerty) {
				// 若该字段是需要导出的字段则写入Excel
				Object o = ReflectUtils.getProertyValue(obj, str);
				String value = o == null ? "" : o.toString();
				// 设置cell的值
				sb.append("\t" + value + ",");
			}
			sb.append("\r\n");

			if (row % 1000 == 0) {
				out.write(sb.toString().getBytes(LX100Constant.CHAR_SET));
				out.flush();
				sb = new StringBuilder();
			}
		}
		out.write(sb.toString().getBytes(LX100Constant.CHAR_SET));
		out.flush();
		out.close();
		return file;
	}

	/**
	 * 创建excel文件
	 * 
	 * @param list
	 * @param head
	 * @param proerty
	 * @param fileName
	 * @return
	 * @throws Exception
	 */
	public static File createExcel(List list, List<String> head, List<String> proerty, String fileName) throws Exception {

		// 创建输出文件
		File file = new File(fileName);
		int line = 0;
		int row = 0;
		int sheetNum = 1;
		// 表头格式
		WritableCellFormat wcfF = new jxl.write.WritableCellFormat();
		wcfF.setAlignment(jxl.format.Alignment.CENTRE);
		wcfF.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
		@SuppressWarnings("unused")
		Colour olour;
		wcfF.setBackground(Colour.LIGHT_ORANGE);
		WritableWorkbook wwb = Workbook.createWorkbook(file);
		WritableSheet ws = wwb.createSheet("第" + sheetNum + "页", sheetNum);
		// 设置冻结首行

		ws.getSettings().setVerticalFreeze(1);
		ws.getSettings().setFitWidth(100);
		// 数据格式
		WritableCellFormat dateDcfF = new jxl.write.WritableCellFormat();
		dateDcfF.setWrap(true);
		dateDcfF.setAlignment(jxl.format.Alignment.CENTRE);
		dateDcfF.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

		// 控制列宽
		ws.setColumnView(0, 10);
		ws.setColumnView(1, 18);
		ws.setColumnView(2, 18);
		ws.setColumnView(3, 18);
		ws.setColumnView(4, 18);
		ws.setColumnView(5, 25);
		ws.setColumnView(6, 18);
		ws.setColumnView(7, 18);
		ws.setColumnView(8, 18);
		ws.setColumnView(9, 18);
		ws.setColumnView(10, 18);
		ws.setColumnView(11, 18);
		ws.setColumnView(12, 18);
		ws.setColumnView(13, 18);
		ws.setColumnView(14, 18);
		ws.setColumnView(15, 18);

		sheetNum++;
		// 写入表头
		for (String str : head) {
			Label label = new Label(line, 0, str, wcfF);
			ws.addCell(label);
			line++;
		}
		row++;
		// 写入数据
		for (Object obj : list) {
			line = 0;
			Class className = obj.getClass();
			// 反射所有字段
			Field[] fields = className.getDeclaredFields();

			for (String str : proerty) {
				for (Field field : fields) {
					// 若该字段是需要导出的字段则写入Excel
					if (str.equals(field.getName())) {
						// 修改相应filed的权限
						boolean accessFlag = field.isAccessible();
						field.setAccessible(true);

						// 读取对象中相应的属性的值
						String value = field.get(obj).toString();
						if (str.equals("commendTime")) {
							value = field.get(obj).toString().substring(0, 19);
						}
						// 设置cell的值
						Label label = new Label(line, row, value, dateDcfF);
						ws.addCell(label);

						// 恢复相应field的权限
						field.setAccessible(accessFlag);
						line++;
					}
				}
			}
			row++;
			// 行数超过10000行是数据放入下一个sheet
			if (row % 10000 == 0) {
				// 设置标题格式
				line = 0;
				row = 0;
				ws = wwb.createSheet("第" + sheetNum + "页", sheetNum);
				// 设置冻结首行
				ws.getSettings().setVerticalFreeze(1);
				// 控制列宽
				ws.setColumnView(0, 10);
				ws.setColumnView(1, 18);
				ws.setColumnView(2, 18);
				ws.setColumnView(3, 18);
				ws.setColumnView(4, 18);
				sheetNum++;
				// 再次写入表头
				for (String str : head) {
					Label label = new Label(line, 0, str, wcfF);
					ws.addCell(label);
					line++;
				}
				row++;
			}
		}
		// 写入数据并关闭文件
		wwb.write();
		wwb.close();

		return file;
	}

}

POJO实体类

/**
 * 售后信息
 */
public class FreeCallInfo {
	//商品ID
	private Long goodsId;
	// 机型
	private String goodsName;
	//县公司Id
	private Long cityId;
	// 县公司名称
	private String cityName;
	// 分公司Id
	private Long countyId;
	/ 分公司名称
	private String countyName;
	// 数量
	private Long maintainNumber;
	// 修复方式
	private String maintainType;
	//维修方式
	private Long auditIsMaintain;
	//get、set
}


查找数据的方法:
public List<FreeCallInfo> query(Long cityId, Long countyId, Long mainType, String keyWord, String startTime, String endTime) {
		Object[] objs = null;
	    StringBuilder sb = new StringBuilder(
	        " select gi.goods_name as goodsName, " +
	        "case" +
	         " when fm.audit_is_machine = 0 then" +
	         "  '维修'" +
	         " when fm.audit_is_machine = 1 then " +
	         "  '换机'" +
	         " when fm.audit_is_machine = 2 then " +
	         "  '丢失'" +
	       " end as maintainType," +
			        "count(fm.goods_id) as maintainNumber" +
			  " from erp_freecall_monitor fm" +
			  " left join erp_goods_info gi" +
			  "   on fm.goods_id = gi.id" +
			  " left join erp_organisation oo" +
			  "   on oo.id = fm.org_id" +
			  " left join erp_dim_county dc" +
			  "   on oo.county_id = dc.county_id" +
			  " left join erp_dim_city cc" +
			  "   on cc.city_id = dc.city_id " +
			 " where fm.record_status = 2 ");
		if (mainType == 3) {
			objs = new Object[] { cityId, countyId, keyWord, startTime, endTime };
			sb.append("and oo.city_id = ? and oo.county_id = ? and gi.goods_name like ? ");
		} else {
			objs = new Object[] { cityId, countyId, mainType, keyWord, startTime, endTime };
			sb.append("and oo.city_id = ? and oo.county_id = ? and fm.audit_is_machine = ? and gi.goods_name like ? ");
		}
		sb.append("and to_char(fm.maintain_time, 'yyyy-MM-dd') >= ? " +
		  "and to_char(fm.maintain_time, 'yyyy-MM-dd') <= ? " );
	    sb.append("group by gi.goods_name, fm.audit_is_machine");
	    List list = (List) this.getJdbcTemplate().query(sb.toString(), objs,new RowMapperResultSetExtractor(new RowMapper() {
	      
	      public Object mapRow(ResultSet res, int arg1) throws SQLException {
	        FreeCallInfo fc = new FreeCallInfo();
	        fc.setGoodsName(res.getString("goodsName"));
	        fc.setMaintainType(res.getString("maintainType"));
	        fc.setMaintainNumber(res.getLong("maintainNumber"));
	        return fc;
	      }
	    }));
	    return list;
	}

页面的导出按钮:
	<input type="button" value="导出" <s:if test="pagination.total == 0">disabled="disabled"</s:if>
										onclick="window.location='<%=basePath%>afterSalesAction!countyExportMaintainInfo.action?mainType=${mainType}&keyWord=${keyWord}&startTime=${startTime}&endTime=${endTime}'" />


导出cvs的action:
/**
	 * 县公司导出售后维修报表
	 */
	public String countyExportMaintainInfo() {
		try {
			freeCallInfolList = freeCallMonitorService.query(user.getOrganisation().getCityId(), user.getOrganisation().getCountyId(), Long.valueOf(mainType), keyWord, startTime, endTime);
			String path = this.getServletContext().getRealPath("/");
			fileName = new String("县公司售后维修报表统计.CSV".getBytes(LX100Constant.CHAR_SET), "ISO8859_1");
			tmpFileName = "temp.csv";
			List<String> head = new ArrayList<String>();
			head.add("机型");
			head.add("维修方式");
			head.add("数量");
			List<String> proerty = new ArrayList<String>();
			proerty.add("goodsName");
			proerty.add("maintainType");
			proerty.add("maintainNumber");
			File file = ExportUtil.createTxtFile(freeCallInfolList, head, proerty, path + tmpFileName);
			inputStream = new FileInputStream(file);
			log.info("用户导出县公司售后维修报表成功");
		} catch (Exception e) {
			log.error("用户导出县公司售后维修报表异常,创建文件异常{}", new Object[] { e });
		}
		return "export_success";
	}

最后还要在sturts.xml中配置:
	<result name="export_success" type="stream">
	      		<param name="inputName">inputStream</param>
	            <param name="contentType">application/octet-stream</param>
				<param name="contentDisposition">attachment;filename="${fileName}"</param>
				<param name="bufferSize">500000</param>
	     	</result>

你可能感兴趣的:(java,Excel,cvs,导出,报表)