package com.cabletech.business.ah.excelreport.sum.impl;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Component;
import com.cabletech.business.ah.excelreport.model.AhExcelReportRecode;
import com.cabletech.business.ah.excelreport.model.AhExcelReportSheet;
import com.cabletech.business.ah.excelreport.sum.BaseSheetSumGenerate;
import com.cabletech.business.excel.AutoGenerateFactory;
import com.cabletech.business.excel.AutoGenerateUtils;
import com.cabletech.business.excel.TableCellData;
/**
* 不包含合计行Sheet按地市汇总
*
* @author 杨隽 2012-06-28 创建
*
*/
@Component
public class SheetSumGenerateS0ShS2 extends BaseSheetSumGenerate {
@Override
public int getTableTdStr(Workbook xwb, AhExcelReportSheet sheetType,
List<List<TableCellData>> rowDataList, AhExcelReportRecode record,
int rowIndex) {
Sheet sheet = xwb.getSheetAt(sheetType.getSheetNum());
Map<String, Double> map = getSumValueMap(xwb, sheet);
List<TableCellData> cellDataList = new ArrayList<TableCellData>();
TableCellData regionCellData = new TableCellData();
String regionName = (String) baseInfoProvider.getRegionService()
.getRegionMap(record.getRegionId()).get("REGIONNAME");
regionCellData.setWidth(100);
regionCellData.setCellValue(regionName);
regionCellData.setRowIndex(rowIndex);
regionCellData.setColIndex(0);
cellDataList.add(regionCellData);
cellDataList.addAll(generateTdString(sheet, map, rowIndex));
super.wbList.add(xwb);
rowDataList.add(cellDataList);
return rowIndex + 1;
}
@Override
public List<List<TableCellData>> getTableSubjectStr(
AhExcelReportSheet sheetType, List<AhExcelReportRecode> list)
throws Exception {
List<List<TableCellData>> rowDataList = new ArrayList<List<TableCellData>>();
AhExcelReportRecode record = list.get(0);
String path = record.getFileUrl();
Workbook xwb = AutoGenerateFactory.getWorkbook(path);
Sheet sheet = xwb.getSheetAt(sheetType.getSheetNum());
int rowSpan = DATA_START_ROW_INDEX - sheetType.getRow();
Row row;
for (int i = sheetType.getRow(); i < DATA_START_ROW_INDEX; i++) {
row = sheet.getRow(i);
if (AutoGenerateUtils.isEmpty(row)) {
continue;
}
List<TableCellData> cellDataList = new ArrayList<TableCellData>();
TableCellData data = new TableCellData();
if (i == sheetType.getRow()) {
data.setRowSpan(rowSpan);
data.setCellValue("地市");
data.setRowIndex(i - sheetType.getRow());
data.setColIndex(0);
cellDataList.add(data);
}
int descCol = 0;
for (int j = SUM_START_COL_INDEX; j < row.getLastCellNum(); j++) {
if (super.isNotSumColumn(sheet, j)) {
descCol++;
continue;
}
data = AutoGenerateUtils.getTdGenerateData(sheet, i, j);
if (data != null) {
data.setRowIndex(i - sheetType.getRow());
data.setColIndex(j - SUM_START_COL_INDEX - descCol + 1);
cellDataList.add(data);
}
}
rowDataList.add(cellDataList);
}
return rowDataList;
}
/**
* 根据工作表sheet中的数值进行累加生成汇总的值Map
*
* @param sheet
* Sheet 工作表sheet
* @param xwb
* Workbook 工作表
* @return Map<String, Double> 汇总的值Map
*/
private Map<String, Double> getSumValueMap(Workbook xwb, Sheet sheet) {
Row firstRow = sheet.getRow(0);
Row row;
Map<String, Double> map = new HashMap<String, Double>();
Row dataFirstRow = sheet.getRow(DATA_START_ROW_INDEX);
for (int i = DATA_START_ROW_INDEX; i < sheet.getPhysicalNumberOfRows(); i++) {
row = sheet.getRow(i);
if (AutoGenerateUtils.isEmpty(row)) {
continue;
}
int index = 0;
for (int j = SUM_START_COL_INDEX; j < row.getLastCellNum(); j++) {
if (super.isNotSumColumn(sheet, j)) {
continue;
}
String firstCellValue = AutoGenerateUtils.getCellValue(
firstRow, j);
String cellValue = AutoGenerateUtils.getCellValue(row, j);
super.getTotalSumValueMap(sheet, cellValue, j);
super.getJoinTotalSumValueMap(xwb, sheet, j);
Double number = new Double(0);
String key = Integer.toString(index);
if (map.containsKey(key)) {
number = map.get(key);
}
if (super.isDividedColumn(sheet, j)) {
DecimalFormat f = super.getNumberFormat(dataFirstRow, j);
Matcher matcher = DIVIDE_FOMULA_PATTERN
.matcher(firstCellValue);
if (matcher.find()) {
double numerator = map.get(Integer.toString(Integer
.parseInt(matcher.group(1))
- SUM_START_COL_INDEX));
double denominator = map.get(Integer.toString(Integer
.parseInt(matcher.group(2))
- SUM_START_COL_INDEX));
if (denominator == 0) {
number = 0d;
} else {
number = numerator / denominator;
}
}
Matcher joinMatcher = JOIN_DIVIDE_FOMULA_PATTERN
.matcher(firstCellValue);
if (joinMatcher.find()) {
double numerator = map.get(Integer.toString(Integer
.parseInt(joinMatcher.group(1))
- SUM_START_COL_INDEX));
double denominator = super.joinTotalValueMap.get(key);
if (denominator == 0) {
number = 0d;
} else {
number = numerator / denominator;
}
}
} else {
number += Double.parseDouble(cellValue);
}
map.put(key, number);
index++;
}
}
return map;
}
/**
* 生成汇总后的单元格数据信息字串
*
* @param sheet
* Sheet 工作表sheet
* @param map
* Map<String, Double> 汇总的值Map
* @param rowIndex
* int
* @return List<TableCellData> 汇总后的单元格数据信息
*/
private List<TableCellData> generateTdString(Sheet sheet,
Map<String, Double> map, int rowIndex) {
List<TableCellData> cellDataList = new ArrayList<TableCellData>();
Row firstRow = sheet.getRow(DATA_START_ROW_INDEX);
Row dataFirstRow = sheet.getRow(DATA_START_ROW_INDEX);
int index = 0;
int descCol = 0;
for (int j = SUM_START_COL_INDEX; j < firstRow.getLastCellNum(); j++) {
if (super.isNotSumColumn(sheet, j)) {
descCol++;
continue;
}
TableCellData data = new TableCellData();
int width = (int) (sheet.getColumnWidth(j) * AutoGenerateUtils.CHAR_WIDTH_PERCENT);
String key = Integer.toString(index);
DecimalFormat fmt = super.getNumberFormat(dataFirstRow, index
+ SUM_START_COL_INDEX);
Double number = map.get(key);
String value = fmt.format(number);
data.setWidth(width);
data.setCellValue(value);
data.setRowIndex(rowIndex);
data.setColIndex(j - SUM_START_COL_INDEX - descCol + 1);
cellDataList.add(data);
index++;
}
return cellDataList;
}
}