Java读写Excel,附DecimalFormat数字格式用法

1、导入相关依赖

maven依赖

<!-- excel读取 -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.1.0</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml-schemas</artifactId>
	<version>4.1.0</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.1.0</version>
</dependency>

2、编写ReadExcel.java

package com.hx.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @author Huathy
 * @time 2020年3月27日  上午10:49:21
 */
@SuppressWarnings("resource")
public class ReadExcel {
	private DecimalFormat df = new DecimalFormat("0.00");	
	// 将double类型的值小数位保留2位
	
	/**
	 * 通过文件方式,将一个Excel中的数据读取到一个集合中
	 * @param file
	 * @return
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	public List<Map<String, String>> importExcel(File fl) throws FileNotFoundException, IOException {
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		// 创建一个excel对象
		Workbook workbook = null;

		String fileName = fl.getName().toLowerCase(); // 获取文件名
		if (fileName.endsWith("xls")) {
			workbook = new HSSFWorkbook(new FileInputStream(fl));
		} else if (fileName.endsWith("xlsx")) {
			workbook = new XSSFWorkbook(new FileInputStream(fl));
		} else {
			throw new RuntimeException("选择的文件不是Excel格式文件...");
		}

		// 获取excel中的Sheet1表(即默认的第一张表)
		Sheet sheet = workbook.getSheet("Sheet1");
		int rows = sheet.getLastRowNum(); // 获取表格的最后一行编号
		if (rows <= 0) { // 如果小于0,则表示表格中没有数据。
			throw new RuntimeException("表格中没有数据...");
		}
		// 循环读取每一行数据
		Row row = null;
		Iterator<Cell> cols = null;
		Map<String, String> map = null;
		
		int index = 0; // 列
		for (int i = 0; i <= rows; i++) {	//从第一行开始读
			index = 0;
			row = sheet.getRow(i);	//获取这一行的列信息
			if (row == null) {
				continue;
			}
			cols = row.cellIterator(); // 获取这一行中的所有列的信息
			map = new HashMap<String, String>();
			while (cols.hasNext()) {
				map.put("第"+String.valueOf(index+1)+"列", getCelltoString(cols.next()));	//cols.next()获取单元格中的值
				index++;
			}
			list.add(map);
		}
		return list;
	}

	/**
	 * 通过流的方式读取excel文件
	 * @param fileName
	 * @param is
	 * @return
	 * @throws IOException
	 */
	public List<Map<String,String>> importExcel(String fileName ,InputStream is) throws IOException{
		List<Map<String,String>> list = new ArrayList<Map<String,String>>();
		//创建一个excel对象
		Workbook workbook = null;

		fileName= fileName.toLowerCase();	//获取文件名
		if(fileName.endsWith("xls")){
			workbook = new HSSFWorkbook(is);
		}else if(fileName.endsWith("xlsx")){
			workbook = new XSSFWorkbook(is);
		}else{
			throw new RuntimeException("选择的文件不是Excel格式文件...");
		}
		
		//获取excel中的一张表
		Sheet sheet = workbook.getSheet("Sheet1");
		int rows = sheet.getLastRowNum();	//获取表格的最后一行编号
		if(rows <= 0){	//小于0,说明没有数据
			throw new RuntimeException("表格中没有数据...");
		}
		
		//循环读取每一行数据
		Row row = null;
		Iterator<Cell> cols = null;
		Map<String,String> map = null;
		
		int index = 0;	//列
		for(int i=0; i<=rows; i++){	//从第一行开始读取
			index = 0;
			row = sheet.getRow(i);
			if(row == null){
				continue;
			}
			cols = row.cellIterator();	//获取这一行中的所有列
			map = new HashMap<String,String>();
			while( cols.hasNext() ){
				map.put("第"+String.valueOf(index+1)+"列", getCelltoString(cols.next()));
				index++;
			}
			list.add(map);
		}
		return list;
	}
	
	/**
	 * 将单元格中的数据转成字符串返回
	 * 
	 * @param cell
	 * @return
	 */
	private String getCelltoString(Cell cell) {
		if (cell == null) {
			return "";
		}
		
		String str = "";
		switch (cell.getCellType()) {
		case STRING:	//string
			str = cell.getStringCellValue(); break;
		case NUMERIC:	//数值型,转为string
			str = String.valueOf(df.format(cell.getNumericCellValue())); break;
		case BOOLEAN:	//Boolean型
			str = String.valueOf(cell.getBooleanCellValue()); break;
		case FORMULA:	//公式
			str = String.valueOf(cell.getCellFormula()); break;
		case BLANK:		//空白
			str = ""; break;
		case ERROR:		//错误
			str = ""; break;
		default:
			str = "";
		}
		return str;
	}
}

3、编写WriteExcel.java

package com.hx.util;

import java.io.FileOutputStream;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @author Huathy
 * @time 2020年3月27日  上午10:49:09
 */
public class WriteExcelXls {
	/**
	 * 
	 * @param path	文件保存路径,仅支持xls格式
	 * @throws Exception 
	 */
	public void WriteXls(List<List<String>> lists,String path) throws Exception{
		if(lists.isEmpty()){
			throw new Exception("集合中没有数据...");
		}
		String fileFormat = path.substring( path.lastIndexOf(".")+1 );
		
		//创建一下工作簿
		Workbook wb = null;
		if( "xls".equals(fileFormat) ){		//以xls格式结尾,创建HSSFWorkbook对象
			wb = new HSSFWorkbook();
		}else if( "xlsx".equals(fileFormat) ){	//以xls格式结尾,创建XSSFWorkbook对象
			wb = new XSSFWorkbook();
		}else {
			throw new Exception("文件保存格式错误...");
		}
		
		//创建Sheet1页面
		Sheet sheet = wb.createSheet("Sheet1");

		List<String> rowData = null;
		//开始写数据
		for(int i=0;i<lists.size();i++){
			//获取每行的数据
			rowData = lists.get(i);
			//创建单元格,括号中的数字表示该行的第几列,从0开始
			Row row = sheet.createRow(i);
			for(int j=0;j<rowData.size();j++){
				//创建单元格并赋值
				row.createCell(j).setCellValue(rowData.get(j));
			}
		}
		
		FileOutputStream fos = new FileOutputStream(path);
		wb.write(fos);
		fos.close();
		wb.close();
		System.out.println(path+" 文件写成功!");
	}
}

4、编写测试类,测试读写

package com.hx.ExcelWR;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.hx.util.ReadExcel;
import com.hx.util.WriteExcelXls;

/**
 * @author Huathy
 * @time 2020年3月27日  上午10:48:59
 */
public class App {
	public static void main(String[] args) {
		String path = "G:\\ExcelRW.xlsx";
		File file = new File(path);
		
		List<List<String>> temp = null;
		try {
			//读取Excel文件测试
			ReadExcel re = new ReadExcel();
			List<Map<String, String>> list = re.importExcel(file);
			System.out.println(list); 
			
			//数据处理,由于我读取数据是List<Map<String, String>>的,但写的时候需要List<String>的参数。故需要对数据进行处理
			temp = new ArrayList<List<String>>();
			List<String> strs = null;
			Map<String,String> map = null;
			for(int i=0;i<list.size();i++){
				strs = new ArrayList<String>();
				map = list.get(i);
				for(int j=0;j<map.size();j++){
					strs.add(map.get("第"+(j+1)+"列"));
				}
				temp.add(strs);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//测试写Excel功能
		WriteExcelXls wex = new WriteExcelXls();
		try {
			wex.WriteXls(temp, "G:\\a.xls");	//测试xls格式
			wex.WriteXls(temp, "G:\\a.xlsx");	//测试xlsx格式
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

读写测试Excel表格及结果

在这里插入图片描述

附:DecimalFormat

DecimalFormat df = new DecimalFormat(“0”);

变量含义
“0”//不保留小数
“0.0”保留1位小数
“00.000”2整数位,3小数位
“#”取所有整数部分
“#.##%”以百分比方式计数,并取2位小数
“#.##E0”显示为科学计数法,并取2位小数
“,###”每三位以逗号进行分隔
“第#列”//不保留小数
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huathy-雨落江南,浮生若梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值