处置OracleERP导出的报表文件

[代码] [Java]代码 package k.finance;

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

import j http://www.starkp.com/linked/20130228.do; xl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

import org.apache.commons.lang3.StringUtils;

public class GetContentFromXls {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String file = "d://cuc.xls";
		GetContentFromXls.get(file);
	}
	
	public static void get(String file){
		Workbook workbook = null;
		try {
			workbook = Workbook.getWorkbook(new File(file));
			Sheet sheet = workbook.getSheet(0);
			//取得文件中一共有多少行
			int totalRows = sheet.getRows();
			System.out.println("总行数:"   totalRows);
			
			//数据处置结果list
			List> okList = new ArrayList>();
			
			List> groupList = getGroupList(sheet, totalRows);
			//得到每组的行数据
			for(Map groupMap : groupList){
				
				
				
				int sIdx = groupMap.get("s");
				int eIdx = groupMap.get("e");
				//取得项目编号,在每组的榜首行。用. split 之后 第5位是项目编号
				String okProjCode = StringUtils.split(getCellValue2Trim(sheet, sIdx),".")[5];
//				System.out.println("项目编号str:"   okProjCode);
				
				
				//取得门类,在每组的第二行。用. split 之后 第3位是门类
				String okCostType = StringUtils.split(getCellValue2Trim(sheet, sIdx 1),".")[3];
//				System.out.println("门类str:"   okCostType);


				
				//取得没项目的明细中,每组本月算计的开端、完毕索引
				List> byhjGroupIdxList = getSumIdxGroup(sheet, sIdx, eIdx);
				for(Map idxMap : byhjGroupIdxList){
					
					Map okMap = new HashMap();
					okMap.put("proj_code", okProjCode);
					okMap.put("cost_type", okCostType);
					
					String colYMStr = getCellValue2Trim(sheet, idxMap.get("s"));
					String colMSumStr = getCellValue2Trim(sheet, idxMap.get("e"));
//					System.out.println("年月列str : "   colYMStr);
//					System.out.println("月算计列str : "   colMSumStr);
					//取得你年月,取colYMStr前8位后trim
					String[] ymVal = StringUtils.split(StringUtils.trimToEmpty(StringUtils.substring(colYMStr, 0, 8)),"-");
					String okYear = ymVal[0];
					String okMonth = ymVal[1];
					okMap.put("year", okYear);
					okMap.put("month", okMonth);
//					System.out.println("年:"   okYear   " - 月:"   okMonth);
					//处置月算计列,按空格split
					String[] sumVal = StringUtils.split(colMSumStr);
					String okJie = sumVal[1];
					String okDai = sumVal[2];
					String okYe = sumVal[4];
					okMap.put("jie", okJie);
					okMap.put("dai", okDai);
					okMap.put("ye", okYe);
//					System.out.println("借:"   okJie   " - 贷:"   okDai   " - 余额:"   okYe);
					okList.add(okMap);
				}
			}
			
//			System.out.println(okList);
			//write to xls
			toXls(okList);
			
			
		} catch (BiffException | IOException | WriteException e) {
			e.printStackTrace();
		}finally{
			workbook.close();
		}
	}

	private static void toXls(final List> okList) throws WriteException, IOException {
		WritableWorkbook workbook = null;
		try {
			workbook = Workbook.createWorkbook(new File("d://output" System.currentTimeMillis() ".xls"));
			WritableSheet sheet = workbook.createSheet("sheet1", 0);
			//写表头
			sheet.addCell(new Label(1, 0, "项目编号"));
			sheet.addCell(new Label(2, 0, "本钱类型"));
			sheet.addCell(new Label(3, 0, "年"));
			sheet.addCell(new Label(4, 0, "月"));
			sheet.addCell(new Label(5, 0, "借"));
			sheet.addCell(new Label(6, 0, "贷"));
			sheet.addCell(new Label(7, 0, "本月余额"));
			
			//写表格内容
			for(int i=0;i map = okList.get(i);
				sheet.addCell(new Label(1, i 1, map.get("proj_code")));
				sheet.addCell(new Label(2, i 1, map.get("cost_type")));
				sheet.addCell(new Label(3, i 1, map.get("year")));
				sheet.addCell(new Label(4, i 1, map.get("month")));
				sheet.addCell(new Label(5, i 1, map.get("jie")));
				sheet.addCell(new Label(6, i 1, map.get("dai")));
				sheet.addCell(new Label(7, i 1, map.get("ye")));
			}
			workbook.write();
		} finally{
			workbook.close();
		}
		
	}

	private static List> getSumIdxGroup(Sheet sheet, int sIdx, int eIdx) {
		//算计组明细的开端索引
		int sumGroupStartIdx = sIdx 4;
		
		//将包括“本月算计”的行打包,开端索引 4,去掉头部信息。并将包括本月算计的索引保存起来
		List byhjIdxList = new ArrayList();
		for(int i=sumGroupStartIdx;i<=eIdx;i  ){
			String byhjValStr = getCellValue2Trim(sheet, i);
//					System.out.println(byhjValStr);
			if(StringUtils.contains(byhjValStr, "本月算计")){
//						System.out.println("本月算计所内行:A" i);
				byhjIdxList.add(i);
			}
		}
//				System.out.println(byhjIdxList);
		
		//处置包括本月算计的组开端索引和组完毕索引
		List> byhjGroupIdxList = new ArrayList>();
		for(int i=0;i map = new HashMap();
			map.put("s", sumGroupStartIdx);
			map.put("e", e);
			if(i 1 < byhjIdxList.size()){
				if(StringUtils.contains(getCellValue2Trim(sheet,e 1),"本年累计")){
					sumGroupStartIdx = e 2;
				}else{
					sumGroupStartIdx = e 1;
				}
			}
			byhjGroupIdxList.add(map);
		}
//		System.out.println(byhjGroupIdxList);
		return byhjGroupIdxList;
	}

	private static List> getGroupList(Sheet sheet, int totalRows) {
		//containKEMUList寄存一切包括【科    目:】的行号
		List containKEMUList = new ArrayList();
		//取得文件中有多少组项目
		for(int i=1;i<=totalRows;i  ){
			//取得col-A中的内容并去掉空格
			String aVal = getCellValue2Trim(sheet,i);
			//将col-A中包括【科    目:】字样的行提取出来
			if(StringUtils.isNotBlank(aVal)

转载于:https://my.oschina.net/u/947963/blog/110997

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值