首先建立maven 工程,pom.xml的内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>Excel</groupId> <artifactId>Excel</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>Excel</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies>
/*apache 的poi包主要是处理excel的*/ <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11-beta1</version> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version>4.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.11-beta1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
/*由于要导出jar包并且发布线上,所以一下配置主要是导出jar的设置*/ <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>Excel.ExcelOperate</mainClass>//main入口类 </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
工程目录如下:
主要的处理类是ExcelOperate,里面有读取xlsx格式的excel和写入excel。
package Excel; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import java.util.logging.FileHandler; import java.util.logging.Logger; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelOperate { protected final static Logger logger = Logger.getLogger("log"); protected static FileHandler fileHandler = null; private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:ss"); private static DecimalFormat decimalFormat = new DecimalFormat("0"); private static Map<String, String> mapRel = new HashMap<String, String>(); /** * hotel_orders key 酒店ID value map(Key 支付人账号 value List(订单)) */ private static Map<String, Map<String, Set<Order>>> hotel_orders_map = new HashMap<String, Map<String, Set<Order>>>(); /** * orders key 酒店ID value 支付数 */ private static Map<String, Integer> hotel_map = new HashMap<String, Integer>(); private static int orderCount = 0; public static void main(String[] args) throws Exception { Properties prop = new Properties(); final String CONFIGNAME = "/env/PathConfig.properties"; prop.load(ExcelOperate.class.getResourceAsStream(CONFIGNAME)); String path = prop.getProperty("path"); final String logPath =path+ "myLog"; File file = new File(path+"excel/source.xlsx"); getData(file, 5,logPath); List<Export> exportList = method(hotel_orders_map, hotel_map); Integer countColumnNum = Integer.parseInt(prop.getProperty("columCount")); String hotelId = prop.getProperty("hotelId"); String hotelName = prop.getProperty("hotelName"); String chargeCount = prop.getProperty("chargeCount"); String paymentCount = prop.getProperty("paymentCount"); String averageCount = prop.getProperty("averageCount"); String payments = prop.getProperty("payments"); String[] options = {hotelId,hotelName,chargeCount,paymentCount,averageCount,payments}; writeXls(exportList,countColumnNum,options, path+"excel/result.xlsx"); } /*读取excel*/ public static void getData(File file, int ignoreRows,String logPath) throws FileNotFoundException, IOException, InvalidFormatException { XSSFWorkbook wb = new XSSFWorkbook(file); for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { XSSFSheet st = wb.getSheetAt(sheetIndex); for (int rowIndex = ignoreRows; rowIndex < st.getLastRowNum(); rowIndex++) { XSSFRow row = st.getRow(rowIndex); logger.info("读取excel的行数" + rowIndex); if (row == null) { logger.info("row is null."); continue; } if(row.getCell(3)==null || row.getCell(3).getStringCellValue() == null){ logger.info("cell 3 is null."); break; } else { if (row.getCell(3).getStringCellValue().contains("火车票")) { continue; } } if(row.getCell(5)==null || row.getCell(5).getStringCellValue() == null){ logger.info("cell 5 is null."); break; } else { if (row.getCell(5).getStringCellValue().startsWith("支付宝")) { continue; } } String[] values = new String[row.getLastCellNum()+1]; boolean hasValue = false; for (int columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) { String value = ""; XSSFCell cell = row.getCell(columnIndex); if (cell != null) { switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = dateFormat.format(date); } } else { value = decimalFormat.format(cell.getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_FORMULA: // 导入时如果为公式生成的数据则无值 if (!cell.getStringCellValue().equals("")) { value = cell.getStringCellValue(); } break; case HSSFCell.CELL_TYPE_BLANK: case HSSFCell.CELL_TYPE_ERROR: break; case HSSFCell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue() ? "Y" :"N"; break; } } values[columnIndex] = value.trim(); hasValue = true; } if(allIsEmpty(values)){ break; } if (hasValue) { function(values,rowIndex,logPath); } } } wb.close(); } private static boolean allIsEmpty(String[] values){ for(String str : values){ if(!str.isEmpty()){ return false; } } return true; } @SuppressWarnings("resource") public static void writeXls(List<Export> exportList,Integer countColumnNum,String[] options, String path) throws Exception { XSSFWorkbook book = new XSSFWorkbook(); CreationHelper createHelper = book.getCreationHelper(); XSSFCellStyle style = book.createCellStyle(); style.setWrapText(true); XSSFSheet sheet = book.createSheet("orderSheet"); sheet.setColumnWidth(3, 13000); sheet.setDefaultColumnWidth(20); XSSFRow firstRow = sheet.createRow(0); XSSFCell[] firstCells = new XSSFCell[countColumnNum]; for (int j = 0; j < options.length; j++) { firstCells[j] = firstRow.createCell(j); firstCells[j].setCellValue(new XSSFRichTextString(options[j])); } getExport(sheet,style,createHelper,exportList); File file = new File(path); file.getParentFile().mkdirs(); OutputStream os = new FileOutputStream(file); book.write(os); os.close(); } public static void getExport(XSSFSheet sheet,XSSFCellStyle style,CreationHelper createHelper,List<Export> exportList){ int count = hotel_orders_map.size(); for (int i = 0; i < count; i++) { XSSFRow row = sheet.createRow(i + 1); Export export = exportList.get(i); XSSFCell hotelId = row.createCell(0); XSSFCell hotelName = row.createCell(1); XSSFCell chargeCount = row.createCell(2); XSSFCell paymentCount = row.createCell(3); XSSFCell averageCount = row.createCell(4); XSSFCell payments = row.createCell(5); hotelId.setCellValue(export.getHotelId()); hotelName.setCellValue(export.getHotelName()); chargeCount.setCellValue(export.getChargeCount()); paymentCount.setCellValue(export.getPaymentCount()); averageCount.setCellValue(export.getAverageCount()); payments.setCellStyle(style); String test = createHelper.createRichTextString( export.getDisplayPay()).toString(); if(test.length() > 32767){ logger.info("太长!:"+export.getPaymentMap()); logger.info("太长!:"+test); throw new RuntimeException("太长!"); } payments.setCellValue(test); logger.info("写入excel开始,行数是" + i + 1); } } public static void function(String[] values,int rowIndex,String logPath) throws SecurityException, IOException { if (values.length < 3) { return; } StringBuilder sb = new StringBuilder(); for (String str : values) { sb.append(str).append(" "); } logger.info("读取一行excel,数据:" + rowIndex + " "+ sb); String account = values[5]; String time = values[4]; String payOrderId = values[2]; String orderId = findOrderIdFromPayOrderId(payOrderId); String[] hotelInfo = findHotelIdFromOrderId(orderId); if(hotelInfo==null){ return; } String hotelId = hotelInfo[0]; String hotelName = hotelInfo[1]; if(hotelId == null && hotelName == null){ return; } Order order = new Order(account,time,orderId); mapRel.put(hotelId, hotelName); if (!hotel_map.containsKey(hotelId)) { hotel_map.put(hotelId, 1); } else { hotel_map.put(hotelId,hotel_map.get(hotelId) + 1); } if (!hotel_orders_map.containsKey(hotelId)) { hotel_orders_map.put(hotelId, new HashMap<String, Set<Order>>()); } if(hotel_orders_map.get(hotelId).get(account) == null){ hotel_orders_map.get(hotelId).put(account, new HashSet<Order>()); } hotel_orders_map.get(hotelId).get(account).add(order); if(account.contains("871849780@qq.com") || account.contains("ljt19841151@163.com")){ if(fileHandler==null){ fileHandler = new FileHandler(logPath); logger.addHandler(fileHandler); } logger.info("账号:"+account+"酒店ID:"+hotelId+"订单ID:"+orderId+"行号:"+rowIndex); } } @SuppressWarnings("unused") private static String[] getHotelInfoTest(String newStr,String orderId){ String[] hotelInfo = null; if(!newStr.contains("火车") && newStr.contains("订单ID")){ int first = newStr.indexOf(":"); if(first == -1){ first = newStr.indexOf(":"); } int end = newStr.lastIndexOf(")"); if(end == -1){ end = newStr.lastIndexOf(")"); } if(first != -1 && end != -1){ orderId = newStr.substring(first+1,end).trim(); hotelInfo = findHotelIdFromOrderId(orderId); orderCount++; } return hotelInfo; } return null; } private static String[] findHotelIdFromOrderId(String orderId) { String[] hotelInfo = DatabaseConn.searchHotel(orderId); if(hotelInfo==null){ logger.info("没有对应酒店"); } return hotelInfo; } private static String findOrderIdFromPayOrderId(String payOrderId){ String orderId = DatabaseConn.searchOrderId(payOrderId); return orderId; } public static List<Export> method( Map<String, Map<String, Set<Order>>> hotelOrderMap, Map<String, Integer> hotelMap) { List<Export> exportList = new LinkedList<Export>(); for (Entry<String, Map<String, Set<Order>>> entry : hotelOrderMap .entrySet()) { Export export = new Export(); String hotelId = entry.getKey().trim(); export.setHotelId(hotelId); export.setPaymentCount(entry.getValue().size()); export.setHotelName(mapRel.get(hotelId)); export.setChargeCount(hotelMap.get(hotelId)); export.setAverageCount(export.getChargeCount()/ (double)export.getPaymentCount()); export.setDisplayPay(entry.getValue()); exportList.add(export); } return exportList; } public static String skipBlankTrim(String value){ StringBuilder sb = new StringBuilder(); String[] strs = value.split(" "); for(String str : strs){ sb.append(str); } return sb.toString().trim(); } }
工程建立起来后,直接到工程目录(pom.xml所在的目录),cmd输入mvn clean install 就可以在工程目录下target中找到导出的jar 包。
在服务器的 cd /home/work/hotel/java/bin/
jar 包运行脚本:./java -jar /home/tester/Excel-0.0.1-SNAPSHOT.jar Excel.ExcelOperate -Xms1800M -XX:MaxNewSize=256m -server
相关推荐
本篇将深入讲解如何使用Apache POI来读取Excel 2003(.xls)和2007(.xlsx)文件的内容。 首先,我们需要了解Excel文件的两种主要格式:BIFF(Binary Interchange File Format)用于Excel 2003及更早版本,存储为....
1. **读取Excel文件**:你可以使用jxl来打开和解析Excel文件(.xls格式)。通过`Workbook`类,你可以获取到工作簿的所有工作表,并进一步访问单元格内容、样式、公式等信息。 2. **写入Excel文件**:jxl允许开发者...
1. **读取Excel文件**:你可以使用jxl.jar来打开并读取Excel文件中的数据。这涵盖了读取单元格值、公式、样式、超链接等信息。通过创建`Workbook`对象并调用`Workbook.getSheet(int)`方法,可以获取指定索引的工作表...
这表明我们要关注的是使用Apache POI与.xlsx文件的交互,包括但不限于读取工作表、行、单元格,写入数据,处理公式,以及设置样式和格式。 至于提供的`TestRead.java`文件,这可能是一个示例代码,用于演示如何使用...
- **读取Excel文件**:支持.xls和.xlsx两种格式。 - **写入Excel文件**:可以在新的或现有的Excel文件中插入数据。 - **数据处理**:提供了一系列方法来处理单元格、行、列以及工作表。 - **样式设置**:允许设置...
Apache POI 是一个广泛使用的 Java 库,专为处理 Microsoft Office 格式的文件,包括 Excel、Word 和 PowerPoint。它是一个免费且开源的解决方案,允许开发者使用 Java 读取、创建和修改这些文件。在本文中,我们将...
这个库支持Excel 97至2003的格式(.xls),虽然不支持新的.xlsx格式,但在很多老项目或者对新格式不敏感的场景下,jxl仍然是一个可靠的选择。 在"ExcelUtilsDemo"这个示例中,我们可以预见到它可能包含了一个Java类...
2. **写入Excel文件**:不仅限于读取,jExcelAPI还允许你创建新的Excel文件或向已有文件添加新的工作表。你可以设置单元格的值、样式(如字体、颜色、边框等)、公式,以及行和列的属性。 3. **操作工作表**:你...
- **Java API层**:封装了一系列与Excel相关的操作,包括创建、读取、写入等。 - **JNI桥接层**:作为Java与本地代码之间的桥梁,通过此层可以调用C/C++编写的代码。 - **C/C++代码层**:负责与Excel进行交互,通过...
3. **写入Excel文件** 写入数据到Excel同样简单,下面的代码创建一个新的Excel文件并写入数据: ```java WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls")); WritableSheet sheet =...
这个库支持多种Office文档格式,包括XLS(X)、DOC(X)、PPT(X)等,不仅限于Excel。以下将详细介绍如何使用Apache POI进行Java读写Excel的基本操作。 1. **生成Workbook** 创建一个Workbook对象是开始处理Excel文件...
总之,Java中处理Excel文件是一项广泛使用的技能,涉及到的内容丰富多样,包括但不限于文件读写、数据转换、格式设定等。通过熟练掌握Apache POI等工具,我们可以高效地实现Excel的导入与导出功能。
JExcelApi是一个广泛使用的开源Java库,支持读取和写入Excel 97-2003格式(.xls)的文件,但不支持较新的Excel 2007+的OpenXML格式(.xlsx)。通过这个库,开发者可以直接操作Excel工作表,获取或设置单元格值,处理...
Apache POI完全基于Java语言编写,支持多种Office文档格式,包括但不限于`.xls`、`.xlsx`等。本文主要关注的是如何利用Apache POI对Excel文件进行读写操作。 #### 安装与配置 在开始编写代码之前,首先需要确保...
在 Java 中,可以通过多种方式来读取和写入 Excel 文件,包括但不限于 Apache POI、JXL 等库。其中,JXL 是一个比较早期且功能强大的 Java 库,用于读写 Excel 文件。它支持 Excel 97-2003 格式的文件(.xls),但不...
本项目“ReadService.7z”专注于利用Java来读取Excel文件,然后向其中写入数据,并最终生成一个新的Excel文件。在这个过程中,我们可能会涉及到几个关键的技术点和API,包括但不限于Apache POI库、JSON数据格式以及...
通过Java POI,你可以轻松地在Java程序中读取、写入Excel文件。它支持多种Excel文件格式,包括旧版的.xls文件以及新版的.xlsx文件。 ### 二、设置开发环境 #### 1. 添加依赖 为了使用Java POI,你需要在项目中添加...
Excel文件生成则可能利用了像Microsoft Office Interop库(如果在.NET环境中)、Apache POI(在Java环境)或者JavaScript库如SheetJS这样的工具,来创建和写入XLS或XLSX文件。 在“GridToExcel”这个压缩包文件中,...
6. 导入数据:读取Excel文件,解析每个单元格的内容。 7. 批量插入:将解析的数据转换为数据库的INSERT语句,批量执行插入操作。 这个工具简化了数据处理的复杂性,使得开发者可以更加专注于业务逻辑,而不是底层...