使用POI读写EXCEL文件 [poi3.9]


 

读SHEET内容:

写入红框中内容:

 

执行结果:

 

导入jar包:

 

类和代码:

package com.itcast.poi.helloworld;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.DateUtil;
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.ss.usermodel.WorkbookFactory;

import com.itcast.poi.util.NumberUtils;

/**
 * POI3.9版本 工具类 版本01
 * @author 吕鹏
 * @date 2012-12-22
 */
public class PoiHelloworld {
	static SimpleDateFormat sFormat = new SimpleDateFormat("yyyy-MM-dd");
	static Map<String,CellStyle> styleMap = new HashMap<String,CellStyle>(); //存储单元格样式的Map
	
	
	public static void main(String[] args) {
		/**
		 * 读文件
		 */
		readExcel("D:/a.xlsx");
		
		/**
		 * 写文件
		 */
		testWrite("D:/a.xlsx","D:/b.xlsx");
	}
	
	/**
	 * 读excel 
	 * @param filePath excel路径
	 */
	public static  void readExcel(String filePath){
		Workbook book = null;
		try {
			book = getExcelWorkbook(filePath);
			Sheet sheet = getSheetByNum(book,1);
			System.out.println("sheet名称是:"+sheet.getSheetName());
			
			int lastRowNum = sheet.getLastRowNum();
			
			Row row = null;
			for(int i=0;i<=lastRowNum;i++){
				row = sheet.getRow(i);
				if(row != null){
					System.out.println("正在读第"+(i+1)+"行:");
					int lastCellNum = row.getLastCellNum();
					Cell cell = null;
					StringBuilder sb = null;
					for(int j=0;j<lastCellNum;j++){
						cell = row.getCell(j);
						if(cell != null){
							sb = new StringBuilder("第"+(j+1)+"列的单元格内容是:");
							String type_cn = null;
							String type_style = cell.getCellStyle().getDataFormatString().toUpperCase();
							String type_style_cn = getCellStyleByChinese(type_style);
							int type = cell.getCellType();
							String value = "";
							switch (type) {
								case 0:
									if(DateUtil.isCellDateFormatted(cell)){
										type_cn = "NUMBER-DATE";
										Date date = cell.getDateCellValue();
										value = sFormat.format(date);
									}else {
										type_cn = "NUMBER";
										double tempValue = cell.getNumericCellValue();
										value = String.valueOf(tempValue);
									}
									break;
								case 1:
									type_cn = "STRING";
									value = cell.getStringCellValue();
									break;
								case 2:
									type_cn = "FORMULA";
									value = cell.getCellFormula();
									break;
								case 3:
									type_cn = "BLANK";
									value = cell.getStringCellValue();
									break;
								case 4:
									type_cn = "BOOLEAN";
									boolean tempValue = cell.getBooleanCellValue();
									value = String.valueOf(tempValue);
									break;
								case 5:
									type_cn = "ERROR";
									byte b = cell.getErrorCellValue();
									value = String.valueOf(b);
								default:
									break;
							}
							sb.append(value + ",内容类型是:"+type_cn+",单元格的格式是:"+type_style_cn);
							System.out.println(sb.toString());
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}

	
	/**
	 * 根据单元格的格式 返回单元格的格式中文
	 * @param type_style
	 * @return
	 */
	private static String getCellStyleByChinese(String type_style) {
		String cell_style_cn = "";
		if(type_style.contains("GENERAL")){
			cell_style_cn = "常规";
		}else if(type_style.equals("_ * #,##0.00_ ;_ * \\-#,##0.00_ ;_ * \"-\"??_ ;_ @_ ")){
			cell_style_cn = "会计专用";
		}else if(type_style.equals("0")){
			cell_style_cn = "整数";
		}else if(type_style.contains("YYYY/MM") || type_style.contains("YYYY\\-MM")){
			cell_style_cn = "日期";
		}else if(type_style.equals("0.00%")){
			cell_style_cn = "百分比";
		}else {
			cell_style_cn = "不符合规定格式类型:"+type_style;
//			cell_style_cn = type_style;
		}
		return cell_style_cn;
	}
	
	
	/**
	 * 写内容到excel中
	 * @throws IOException 
	 */
	public static void testWrite(String srcFilePath,String tarFilePath){
		FileOutputStream out = null;
		try {
			Workbook book = getExcelWorkbook(srcFilePath);
			Sheet sheet = getSheetByNum(book,1);
			
			Map<String,String> map = new HashMap<String, String>();
			List<Map<String,String>> list = new LinkedList<Map<String,String>>();
			map.put("A", "4,INT");
			map.put("B", "小红,GENERAL");
			map.put("C", "18,INT");
			map.put("D", "1990-03-10,DATE");
			map.put("E", "0.056,PERCENT");
			map.put("F", "4800,DOUBLE");
			list.add(map);
			
			int startRow = 6;
			boolean result = writeToExcel(list, sheet,startRow);
			if(result){
				out = new FileOutputStream(tarFilePath);
				book.write(out);
				System.out.println("文件写入完成!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 将传入的内容写入到excel中sheet里
	 * @param list
	 */
	public static boolean writeToExcel(List<Map<String,String>> list,Sheet sheet,int startRow){
		boolean result = false;
		try {
			Map<String,String> map = null;
			Row row = null;
			for(int i=0;i<list.size();i++){
				map = list.get(i);
				row = sheet.getRow(startRow-1);
				if(row == null){
					row = sheet.createRow(startRow-1);
				}
				startRow ++;
				Cell cell = null;
				
				BigDecimal db = null;
				for(Map.Entry<String,String> entry : map.entrySet()){
					String key = entry.getKey();
					int colNum = NumberUtils.toNum_new(key)-1;
					
					String value_type = entry.getValue();
					String value = value_type.split(",")[0];
					String style = value_type.split(",")[1];
					
					cell = row.getCell(colNum);
					if(cell == null){
						cell = row.createCell(colNum);
					}
					if(style.equals("GENERAL")){
						cell.setCellValue(value);
					}else{
						if(style.equals("DOUBLE") || style.equals("INT")){
							db = new BigDecimal(value,java.math.MathContext.UNLIMITED);
							cell.setCellValue(db.doubleValue());
						}else if(style.equals("PERCENT")){
							db = new BigDecimal(value,java.math.MathContext.UNLIMITED);
							cell.setCellValue(db.doubleValue());
						}else if(style.equals("DATE")){
							java.util.Date date = sFormat.parse(value);
							cell.setCellValue(date);
						}
						cell.setCellStyle(styleMap.get(style));
					}
				}
			}
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e.getMessage());
		}
		return result;
	}
	/**
	 * 获取excel的Workbook
	 * @throws IOException 
	 */
	public static Workbook getExcelWorkbook(String filePath) throws IOException{
		Workbook book = null;
		File file  = null;
		FileInputStream fis = null;	
		
		try {
			file = new File(filePath);
			if(!file.exists()){
				throw new RuntimeException("文件不存在");
			}else{
				fis = new FileInputStream(file);
				book = WorkbookFactory.create(fis);
				initStyleMap(book);
			}
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage());
		} finally {
			if(fis != null){
				fis.close();
			}
		}
		return book;
	}
	
	/**
	 * 根据索引 返回Sheet
	 * @param number
	 */
	public static Sheet getSheetByNum(Workbook book,int number){
		Sheet sheet = null;
		try {
			sheet = book.getSheetAt(number-1);
//			if(sheet == null){
//				sheet = book.createSheet("Sheet"+number);
//			}
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage());
		}
		return sheet;
	}
	
	/**
	 * 初始化格式Map
	 */
	
	
	public static void initStyleMap(Workbook book){
		DataFormat hssfDF = book.createDataFormat();
		
		CellStyle doubleStyle = book.createCellStyle(); //会计专用
		doubleStyle.setDataFormat(hssfDF.getFormat("_ * #,##0.00_ ;_ * \\-#,##0.00_ ;_ * \"-\"??_ ;_ @_ ")); //poi写入后为会计专用
		styleMap.put("DOUBLE", doubleStyle);
		
		CellStyle intStyle = book.createCellStyle(); //会计专用
		intStyle.setDataFormat(hssfDF.getFormat("0")); //poi写入后为会计专用
		styleMap.put("INT", intStyle);
        
       	CellStyle yyyyMMddStyle = book.createCellStyle();//日期yyyyMMdd
        yyyyMMddStyle.setDataFormat(hssfDF.getFormat("yyyy-MM-dd"));
        styleMap.put("DATE", yyyyMMddStyle);
        
        CellStyle percentStyle = book.createCellStyle();//百分比
        percentStyle.setDataFormat(hssfDF.getFormat("0.00%"));
        styleMap.put("PERCENT", percentStyle);
	}
}


 

 附加上 数字转字母的方法:

public static String toLetterString(int number) {
		if (number < 1) {// 
			return null;
		}
		if (number < 27) {
			return String.valueOf((char) ('A' + number - 1));
		}
		if (number % 26 == 0) {
			return toLetterString(number / 26 - 1) + "Z";
		}
		return toLetterString(number / 26)+ String.valueOf((char) ('A' + number % 26 - 1));
	}

 

源代码地址:


http://download.csdn.net/detail/qq522935502/4986839 

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值