需要达到的效果图如下:
上代码:
/** * Copyright (c) 2004-2014 All Rights Reserved. */ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.beanutils.BeanUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.alibaba.common.lang.StringUtil; import com.alibaba.common.lang.io.ByteArrayOutputStream; import com.alibaba.common.logging.Logger; import com.alibaba.common.logging.LoggerFactory; import CacheUtil; import UserDataCacheKeyUtil; import DateUtilExt; import IOUtil; import LoggerUtil; import OnDayKeepVO; import UserKeepData; import WithinDayKeepVO; import SessionUtil; import ResourceViewModelDescriptor; /** * @author * @version $Id: DownloadExcelController.java, v 0.1 2014-9-9 下午05:06:56 wb-jiatao Exp $ */ @Controller @RequestMapping("/rententionDownload.resource") public class DownloadExcelController { private static final Logger logger = LoggerFactory .getLogger(DownloadExcelController.class); /** */ private static final String READABLE_DATE_FORMATE = "yyyy年MM月dd日"; @RequestMapping(method = RequestMethod.GET) public void doGet(ModelMap modelMap, HttpServletRequest request) throws Exception { //1.创建excel HSSFWorkbook wb = new HSSFWorkbook(); //2.指定颜色 wb.getCustomPalette().setColorAtIndex(IndexedColors.DARK_BLUE.getIndex(), (byte) 224, (byte) 255, (byte) 255); //3.创建2个页 Sheet onSheet = wb.createSheet("单日留存数据"); Sheet wiSheet = wb.createSheet("累计留存数据"); createHead(wb, onSheet); createHead(wb, wiSheet); //4.从缓存中获取数据 UserKeepData keepData = (UserKeepData) CacheUtil.getCache(UserDataCacheKeyUtil .getKeepDataExcelCacheKey(SessionUtil.getAppId(request), SessionUtil.getUserId())); String startDate = null; String endDate = null; if (keepData != null) { //5.解析数据,填充excel List<OnDayKeepVO> onDatas = keepData.getOnDatas(); List<WithinDayKeepVO> winthinDatas = keepData.getWinthinDatas(); CreationHelper helper = wb.getCreationHelper(); CellStyle dateStyle = UserKeepDataExcelHelper.createBodyStyleCell(wb); dateStyle.setDataFormat(helper.createDataFormat().getFormat(READABLE_DATE_FORMATE)); CellStyle textStyle = UserKeepDataExcelHelper.createBodyStyleCell(wb); CellStyle doubleStyle = UserKeepDataExcelHelper.createBodyStyleCell(wb); doubleStyle.setDataFormat(helper.createDataFormat().getFormat("0.0%")); if (!CollectionUtils.isEmpty(onDatas)) { startDate = onDatas.get(0).getReportDate(); endDate = onDatas.get(onDatas.size() - 1).getReportDate(); fillOnDaySheetData(onSheet, onDatas, dateStyle, textStyle, doubleStyle); } if (!CollectionUtils.isEmpty(winthinDatas)) { fillWithinSheet(wiSheet, winthinDatas, dateStyle, textStyle, doubleStyle); } } ResourceViewModelDescriptor resDescriptor = new ResourceViewModelDescriptor(); modelMap.addAttribute(ResourceViewModelDescriptor.RESOURCE_VIEW_MODEL_KEY, resDescriptor); startDate = StringUtil.isEmpty(startDate) ? "" : DateUtilExt.format(new SimpleDateFormat( "yyyyMMdd").parse(startDate), READABLE_DATE_FORMATE); endDate = StringUtil.isEmpty(endDate) ? "" : DateUtilExt.format(new SimpleDateFormat( "yyyyMMdd").parse(endDate), READABLE_DATE_FORMATE); ByteArrayOutputStream os = null; try { os = new ByteArrayOutputStream(); wb.write(os); os.flush(); resDescriptor.setSourceFileData(os.toByteArray().getBytes()); } catch (Exception e) { LoggerUtil.error(logger, "DownloadExcelController#doGet下载数据异常", e); } finally { IOUtil.closeStreamSafely(os); } String outputFileName = startDate + "至" + endDate + "数据报表.xls"; outputFileName = StringUtil.isEmpty(startDate) ? "无数据.xls" : outputFileName; resDescriptor.setOutputFileName(outputFileName); } /** * * @param wiSheet * @param winthinDatas * @param dateStyle * @param textStyle * @param doubleStyle * @throws ParseException */ private static void fillWithinSheet(Sheet wiSheet, List<WithinDayKeepVO> winthinDatas, CellStyle dateStyle, CellStyle textStyle, CellStyle doubleStyle) throws ParseException { int rowIndex = 2; for (WithinDayKeepVO wi : winthinDatas) { Row wiRow = wiSheet.createRow(rowIndex++); Map<String, Double> withinDayKeepRates = wi.getWithinDayKeepRates(); for (int i = 0; i < 11; i++) { Cell aCell = wiRow.createCell(i); switch (i) { case 0: //style aCell.setCellStyle(dateStyle); //数据 String reportDate = wi.getReportDate(); Date date = new SimpleDateFormat("yyyyMMdd").parse(reportDate); aCell.setCellValue(date); break; case 1: //style aCell.setCellStyle(textStyle); //data aCell.setCellValue(wi.getNewFollowCount()); break; case 9: //style aCell.setCellStyle(doubleStyle); //data String key = "focus_15d_user_cnt"; Double v = withinDayKeepRates.get(key); v = v == null ? 0L : v; aCell.setCellValue(v.doubleValue()); break; case 10: //style aCell.setCellStyle(doubleStyle); //data key = "focus_30d_user_cnt"; v = withinDayKeepRates.get(key); v = v == null ? 0L : v; aCell.setCellValue(v.doubleValue()); break; default: //style aCell.setCellStyle(doubleStyle); //data key = "focus_" + (i - 1) + "d_user_cnt"; v = withinDayKeepRates.get(key); v = v == null ? 0L : v; aCell.setCellValue(v.doubleValue()); } } } } /** * * @param onSheet * @param onDatas * @param dateStyle * @param textStyle * @param doubleStyle * @throws ParseException */ private static void fillOnDaySheetData(Sheet onSheet, List<OnDayKeepVO> onDatas, CellStyle dateStyle, CellStyle textStyle, CellStyle doubleStyle) throws ParseException { int rowIndex = 2; for (OnDayKeepVO on : onDatas) { Row onRow = onSheet.createRow(rowIndex++); Map<String, Double> onDayKeepRates = on.getOnDayKeepRates(); for (int i = 0; i < 11; i++) { Cell aCell = onRow.createCell(i); switch (i) { case 0: //style aCell.setCellStyle(dateStyle); //数据 String reportDate = on.getReportDate(); Date date = new SimpleDateFormat("yyyyMMdd").parse(reportDate); aCell.setCellValue(date); break; case 1: //style aCell.setCellStyle(textStyle); //data aCell.setCellValue(on.getNewFollowCount()); break; case 9: //style aCell.setCellStyle(doubleStyle); //data String key = "focus_on_15d_user_cnt"; Double v = onDayKeepRates.get(key); v = v == null ? 0L : v; aCell.setCellValue(v.doubleValue()); break; case 10: //style aCell.setCellStyle(doubleStyle); //data key = "focus_on_30d_user_cnt"; v = onDayKeepRates.get(key); v = v == null ? 0L : v; aCell.setCellValue(v.doubleValue()); break; default: //style aCell.setCellStyle(doubleStyle); //data key = "focus_on_" + (i - 1) + "d_user_cnt"; v = onDayKeepRates.get(key); v = v == null ? 0L : v; aCell.setCellValue(v.doubleValue()); } } } } /** * * @param wb * @param keepSheet */ private static void createHead(HSSFWorkbook wb, Sheet keepSheet) { //创建头部标题 keepSheet.setColumnWidth(0, 17 * 256); keepSheet.setColumnWidth(1, 15 * 256); Row row1 = keepSheet.createRow(0); Row row2 = keepSheet.createRow(1); List<Cell> cellList1 = new ArrayList<Cell>(); List<Cell> cellList2 = new ArrayList<Cell>(); for (int i = 0; i < 11; i++) { Cell createCell = row1.createCell(i); CellStyle createHeadStyleCell = UserKeepDataExcelHelper.createHeadStyleCell(wb); createCell.setCellStyle(createHeadStyleCell); cellList1.add(createCell); Cell createCell2 = row2.createCell(i); createCell2.setCellStyle(createHeadStyleCell); cellList2.add(createCell2); } Cell cell = cellList1.get(0); cell.setCellValue("日期"); cellList1.get(1).setCellValue("新增关注用户"); cellList1.get(2).setCellValue("留存率"); cellList2.get(2).setCellValue("第1天"); cellList2.get(3).setCellValue("第2天"); cellList2.get(4).setCellValue("第3天"); cellList2.get(5).setCellValue("第4天"); cellList2.get(6).setCellValue("第5天"); cellList2.get(7).setCellValue("第6天"); cellList2.get(8).setCellValue("第7天"); cellList2.get(9).setCellValue("第15天"); cellList2.get(10).setCellValue("第30天"); keepSheet.addMergedRegion(CellRangeAddress.valueOf("A1:A2")); keepSheet.addMergedRegion(CellRangeAddress.valueOf("B1:B2")); keepSheet.addMergedRegion(CellRangeAddress.valueOf("C1:K1")); } @SuppressWarnings("unused") private static final void prepareData() throws Exception { UserKeepData keepData = new UserKeepData(); OnDayKeepVO o1 = new OnDayKeepVO(); o1.setNewFollowCount(100); o1.setReportDate("20140909"); for (int i = 0; i < 9; i++) { o1.getOnDayKeepRates().put("focus_on_" + (i + 1) + "d_user_cnt", 0.011 * (i + 1)); } OnDayKeepVO o2 = new OnDayKeepVO(); BeanUtils.copyProperties(o2, o1); keepData.getOnDatas().add(o1); keepData.getOnDatas().add(o2); WithinDayKeepVO w1 = new WithinDayKeepVO(); w1.setNewFollowCount(1000); w1.setReportDate("20140904"); for (int i = 0; i < 9; i++) { w1.getWithinDayKeepRates().put("focus_" + (i + 1) + "d_user_cnt", 0.12 * (i + 1)); } keepData.getWinthinDatas().add(w1); } }
/** * Copyright (c) 2004-2014 All Rights Reserved. */ import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Workbook; /** * 用户留存数据excel帮助类 * @author * @version $Id: UserKeepDataExcelHelper.java, v 0.1 2014-9-10 上午11:01:50 wb-jiatao Exp $ */ public abstract class UserKeepDataExcelHelper { /** * 边框 * @param wb * @return */ public static CellStyle createHeadStyleCell(Workbook wb) { CellStyle cellStyle = wb.createCellStyle(); //设置一个单元格边框颜色 cellStyle.setBorderBottom(CellStyle.BORDER_THIN); cellStyle.setBorderTop(CellStyle.BORDER_THIN); cellStyle.setBorderLeft(CellStyle.BORDER_THIN); cellStyle.setBorderRight(CellStyle.BORDER_THIN); //设置一个单元格边框颜色 cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setAlignment(CellStyle.ALIGN_CENTER); cellStyle.setVerticalAlignment(CellStyle.ALIGN_CENTER); cellStyle.setFillForegroundColor(IndexedColors.DARK_BLUE.getIndex()); cellStyle.setFont(UserKeepDataExcelHelper.createHeadFonts(wb)); cellStyle.setShrinkToFit(true); return cellStyle; } /** * 边框 * @param wb * @return */ public static CellStyle createBodyStyleCell(Workbook wb) { CellStyle cellStyle = wb.createCellStyle(); //设置一个单元格边框颜色 cellStyle.setBorderBottom(CellStyle.BORDER_THIN); cellStyle.setBorderTop(CellStyle.BORDER_THIN); cellStyle.setBorderLeft(CellStyle.BORDER_THIN); cellStyle.setBorderRight(CellStyle.BORDER_THIN); //设置一个单元格边框颜色 cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); cellStyle.setAlignment(CellStyle.ALIGN_CENTER); cellStyle.setVerticalAlignment(CellStyle.ALIGN_CENTER); cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); cellStyle.setFont(createBodyFonts(wb)); cellStyle.setShrinkToFit(true); return cellStyle; } /** * 设置文字在单元格里面的位置 * CellStyle.ALIGN_CENTER * CellStyle.VERTICAL_CENTER * @param cellStyle * @param halign * @param valign * @return */ public static CellStyle setCellStyleAlignment(CellStyle cellStyle, short halign, short valign) { //设置上下 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); //设置左右 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); return cellStyle; } /** * 格式化单元格 * 如#,##0.00,m/d/yy去HSSFDataFormat或XSSFDataFormat里面找 * @param cellStyle * @param fmt * @return */ public static CellStyle setCellFormat(CreationHelper helper, CellStyle cellStyle, String fmt) { //还可以用其它方法创建format cellStyle.setDataFormat(helper.createDataFormat().getFormat(fmt)); return cellStyle; } /** * 前景和背景填充的着色 * @param cellStyle * @param bg IndexedColors.ORANGE.getIndex(); * @param fg IndexedColors.ORANGE.getIndex(); * @param fp CellStyle.SOLID_FOREGROUND * @return */ public static CellStyle setFillBackgroundColors(CellStyle cellStyle, short bg, short fg, short fp) { //cellStyle.setFillBackgroundColor(bg); cellStyle.setFillForegroundColor(fg); cellStyle.setFillPattern(fp); return cellStyle; } /** * 设置字体 * @param wb * @return */ public static Font createHeadFonts(Workbook wb) { //创建Font对象 Font font = wb.createFont(); //设置字体 font.setFontName("黑体"); //着色 font.setColor(HSSFColor.BLACK.index); //斜体 // font.setItalic(true); //字体大小 font.setFontHeight((short) 250); return font; } /** * 设置字体 * @param wb * @return */ public static Font createBodyFonts(Workbook wb) { //创建Font对象 Font font = wb.createFont(); //设置字体 font.setFontName("宋体"); //着色 font.setColor(HSSFColor.BLACK.index); //斜体 // font.setItalic(true); //字体大小 font.setFontHeight((short) 250); return font; } }
相关推荐
5. **poi-examples**: 包含了使用Apache POI API的示例代码,可以帮助开发者理解如何实际操作Excel文件。 6. **poi-excelant**: 提供了用于构建和执行Ant任务的工具,这些任务与Excel操作有关,例如创建或处理Excel...
Apache POI是Java领域中广泛使用的库,专为处理Microsoft Office格式的文件而设计,特别是Excel文档。这个库使得在不依赖Microsoft Office的情况下,开发者能够读取、创建、修改和操作XLS、XLSX等Excel文件。在本文...
Apache POI 是一个Java库,它允许开发人员创建、修改和显示Microsoft Office格式...博客文章“Apache POI 导出excel实例”应该会详细介绍这些步骤,并可能提供更具体的示例代码,帮助读者更好地理解和应用Apache POI。
- **写入Excel**:创建新的Excel文件或修改现有文件,可以通过创建`Workbook`实例,添加`Sheet`,进一步添加`Row`和`Cell`,并设置相应值。完成写入后,使用`FileOutputStream`保存到文件系统。 4. **注意事项** ...
在Java开发环境中,Apache POI 提供了丰富的API,使得开发者能够方便地在程序中创建、修改和读取Excel文件。本篇将详细介绍Apache POI在Excel操作中的应用,包括基本概念、使用步骤、关键类和方法以及实际示例。 1....
本文将深入探讨如何使用ITEXT库导出PDF和Word,以及利用Apache POI库导出Excel报表文件。 首先,让我们来了解ITEXT库。ITEXT是一个开源Java库,专门用于创建和修改PDF文档。使用ITEXT,你可以方便地生成包含文本、...
Apache POI 是一个开源项目,专门用于处理Microsoft ...总之,Apache POI 是Java开发中处理Excel的强大工具,通过学习和掌握其API,我们可以轻松实现Excel文件的创建、读取和修改,为业务提供便利的数据导出功能。
总结起来,Apache POI为Java开发者提供了一种强大且灵活的方式来处理Excel文件,无论是通过Servlet从服务器生成文件,还是在本地通过main方法创建文件。理解如何使用POI库可以帮助你更好地集成Excel功能到你的Java...
在Java编程环境中,Apache POI库是一个非常重要的工具,它允许开发者读取、写入以及修改...总的来说,Apache POI是Java处理Excel文件的强大工具,通过合理利用提供的库和源码示例,可以有效地读取和操作Excel数据。
在“poi读取excel文件实例”中,我们将讨论如何使用Apache POI API来读取和操作Excel 2007文件。以下是一些关键知识点: 1. **创建工作簿对象**:首先,你需要通过`WorkbookFactory`类的`create()`方法打开或创建一...
Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel。在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,...
Apache POI是一个开源项目,由Apache软件基金会维护,专门用于处理Microsoft Office格式的文件,如Word(.doc/.docx)、Excel(.xls/.xlsx)、PowerPoint(.ppt/.pptx)等。这个资源包是Java开发者在跨平台上读取、...
在Java编程领域,Apache POI 是一个非常流行的库,它允许开发者读取、写入和修改Microsoft Office格式的文件,包括Excel(XLS和XLSX)。本教程将深入探讨如何利用Apache POI来在Excel文件中完美地生成水印。水印通常...
在这个场景中,"POI到处excel文件"意味着我们使用Apache POI库来创建、读取和修改Excel文档。以下是对这个主题的详细说明: 1. **Apache POI简介**: Apache POI 是一个开源项目,它允许开发者使用Java处理...
Apache POI 是基于 Office Open XML 标准(OOXML)和 ...本代码实例是使用java语言写的poi解密excel文件实例代码,代码只实现了.xls类型的excel,.xlsx类型的excel只需把HSSF前缀的类更换成XSSF开通的前缀类即可。
在Java开发中,Apache POI库是一个...总的来说,Apache POI提供了一套强大的API,使得开发者能够在Java应用中方便地创建和下载Excel文件。通过学习和理解这些基本操作,你将能够构建出满足业务需求的Excel处理功能。
"利用Java Apache POI 生成Word文档示例代码" 本篇文章主要介绍了利用Java Apache POI 生成Word文档示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 首先,Apache POI是一个开源的Java库,由Apache...
Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。在这个"poi 解析excel文件内容demo"中,我们主要关注如何使用Apache POI库来读取和解析Excel文件,无论它们是2003版的.XLS还是2007...
2. 创建Workbook对象:使用`WorkbookFactory.create()`方法,传入文件输入流或者文件路径来创建Workbook实例,这代表了整个Excel工作簿。 3. 获取Sheet对象:通过Workbook的`getSheetAt()`或`getSheet()`方法获取...