`
u010815305
  • 浏览: 30166 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 读取excel,写入excel(只限于xlsx格式)

    博客分类:
  • java
阅读更多

首先建立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

分享到:
评论

相关推荐

    使用POI读取excel03/07文件内容

    本篇将深入讲解如何使用Apache POI来读取Excel 2003(.xls)和2007(.xlsx)文件的内容。 首先,我们需要了解Excel文件的两种主要格式:BIFF(Binary Interchange File Format)用于Excel 2003及更早版本,存储为....

    java excel api

    1. **读取Excel文件**:你可以使用jxl来打开和解析Excel文件(.xls格式)。通过`Workbook`类,你可以获取到工作簿的所有工作表,并进一步访问单元格内容、样式、公式等信息。 2. **写入Excel文件**:jxl允许开发者...

    读取excel需要的jar包 jxl.jar

    1. **读取Excel文件**:你可以使用jxl.jar来打开并读取Excel文件中的数据。这涵盖了读取单元格值、公式、样式、超链接等信息。通过创建`Workbook`对象并调用`Workbook.getSheet(int)`方法,可以获取指定索引的工作表...

    POI解析xlsx文件

    这表明我们要关注的是使用Apache POI与.xlsx文件的交互,包括但不限于读取工作表、行、单元格,写入数据,处理公式,以及设置样式和格式。 至于提供的`TestRead.java`文件,这可能是一个示例代码,用于演示如何使用...

    JAVA Excel API教程.pdf

    - **读取Excel文件**:支持.xls和.xlsx两种格式。 - **写入Excel文件**:可以在新的或现有的Excel文件中插入数据。 - **数据处理**:提供了一系列方法来处理单元格、行、列以及工作表。 - **样式设置**:允许设置...

    java读取word,excel和pdf文档-利用POI实现数据导出excel报表.docx

    Apache POI 是一个广泛使用的 Java 库,专为处理 Microsoft Office 格式的文件,包括 Excel、Word 和 PowerPoint。它是一个免费且开源的解决方案,允许开发者使用 Java 读取、创建和修改这些文件。在本文中,我们将...

    Java操作excel的综合应用(jxl)

    这个库支持Excel 97至2003的格式(.xls),虽然不支持新的.xlsx格式,但在很多老项目或者对新格式不敏感的场景下,jxl仍然是一个可靠的选择。 在"ExcelUtilsDemo"这个示例中,我们可以预见到它可能包含了一个Java类...

    jexcelapi.zip_java项目excel导入导出jar包

    2. **写入Excel文件**:不仅限于读取,jExcelAPI还允许你创建新的Excel文件或向已有文件添加新的工作表。你可以设置单元格的值、样式(如字体、颜色、边框等)、公式,以及行和列的属性。 3. **操作工作表**:你...

    Java中Excel操作类的设计与实现

    - **Java API层**:封装了一系列与Excel相关的操作,包括创建、读取、写入等。 - **JNI桥接层**:作为Java与本地代码之间的桥梁,通过此层可以调用C/C++编写的代码。 - **C/C++代码层**:负责与Excel进行交互,通过...

    Java操作Excel的jxl.jar包

    3. **写入Excel文件** 写入数据到Excel同样简单,下面的代码创建一个新的Excel文件并写入数据: ```java WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls")); WritableSheet sheet =...

    Java读写Excel之POI超入门.docx

    这个库支持多种Office文档格式,包括XLS(X)、DOC(X)、PPT(X)等,不仅限于Excel。以下将详细介绍如何使用Apache POI进行Java读写Excel的基本操作。 1. **生成Workbook** 创建一个Workbook对象是开始处理Excel文件...

    excel导入导出,java

    总之,Java中处理Excel文件是一项广泛使用的技能,涉及到的内容丰富多样,包括但不限于文件读写、数据转换、格式设定等。通过熟练掌握Apache POI等工具,我们可以高效地实现Excel的导入与导出功能。

    JEXCEL.jar

    JExcelApi是一个广泛使用的开源Java库,支持读取和写入Excel 97-2003格式(.xls)的文件,但不支持较新的Excel 2007+的OpenXML格式(.xlsx)。通过这个库,开发者可以直接操作Excel工作表,获取或设置单元格值,处理...

    利用apache包来完成excel导入导出

    Apache POI完全基于Java语言编写,支持多种Office文档格式,包括但不限于`.xls`、`.xlsx`等。本文主要关注的是如何利用Apache POI对Excel文件进行读写操作。 #### 安装与配置 在开始编写代码之前,首先需要确保...

    java操作excel

    在 Java 中,可以通过多种方式来读取和写入 Excel 文件,包括但不限于 Apache POI、JXL 等库。其中,JXL 是一个比较早期且功能强大的 Java 库,用于读写 Excel 文件。它支持 Excel 97-2003 格式的文件(.xls),但不...

    ReadService.7z

    本项目“ReadService.7z”专注于利用Java来读取Excel文件,然后向其中写入数据,并最终生成一个新的Excel文件。在这个过程中,我们可能会涉及到几个关键的技术点和API,包括但不限于Apache POI库、JSON数据格式以及...

    详解JAVA_POI导出EXCEL报表的操作(包括各种格式及样式的实现)

    通过Java POI,你可以轻松地在Java程序中读取、写入Excel文件。它支持多种Excel文件格式,包括旧版的.xls文件以及新版的.xlsx文件。 ### 二、设置开发环境 #### 1. 添加依赖 为了使用Java POI,你需要在项目中添加...

    DataGrid_To_Excel

    Excel文件生成则可能利用了像Microsoft Office Interop库(如果在.NET环境中)、Apache POI(在Java环境)或者JavaScript库如SheetJS这样的工具,来创建和写入XLS或XLSX文件。 在“GridToExcel”这个压缩包文件中,...

    一个通用从数据库导出excel、excel导入数据库组件所用到的jar包

    6. 导入数据:读取Excel文件,解析每个单元格的内容。 7. 批量插入:将解析的数据转换为数据库的INSERT语句,批量执行插入操作。 这个工具简化了数据处理的复杂性,使得开发者可以更加专注于业务逻辑,而不是底层...

Global site tag (gtag.js) - Google Analytics