|
|
@@ -0,0 +1,198 @@ |
|
|
|
package cn.afterturn.easypoi.excel.export.template; |
|
|
|
|
|
|
|
import static cn.afterturn.easypoi.util.PoiElUtil.*; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.apache.poi.ss.usermodel.Cell; |
|
|
|
import org.apache.poi.ss.usermodel.Row; |
|
|
|
import org.apache.poi.ss.usermodel.Sheet; |
|
|
|
|
|
|
|
import cn.afterturn.easypoi.util.PoiCellUtil; |
|
|
|
|
|
|
|
/** |
|
|
|
* 针对模板统计问题做统一处理 |
|
|
|
* 1.处理模板之前统计需要SUM的数据以及位置 |
|
|
|
* 2.遍历时统计数据 |
|
|
|
* 3.遍历后设置数据 |
|
|
|
* @author JueYue |
|
|
|
* 2016年6月19日 |
|
|
|
*/ |
|
|
|
public class TemplateSumHandler { |
|
|
|
|
|
|
|
private Map<String, TemplateSumEntity> sumMap = new HashMap<String, TemplateSumEntity>(); |
|
|
|
|
|
|
|
public TemplateSumHandler(Sheet sheet) { |
|
|
|
getAllSumCell(sheet); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 统计计算所有的统计单元格 |
|
|
|
*/ |
|
|
|
private void getAllSumCell(Sheet sheet) { |
|
|
|
Row row = null; |
|
|
|
int index = 0; |
|
|
|
while (index <= sheet.getLastRowNum()) { |
|
|
|
row = sheet.getRow(index++); |
|
|
|
if (row == null) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { |
|
|
|
if (row.getCell(i) != null && PoiCellUtil.getCellValue(row.getCell(i)).contains(SUM)) { |
|
|
|
addSumCellToList(row.getCell(i)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void addSumCellToList(Cell cell) { |
|
|
|
String cellValue = cell.getStringCellValue(); |
|
|
|
int index = 0; |
|
|
|
while ((index = indexOfIgnoreCase(cellValue, SUM, index)) != -1) { |
|
|
|
TemplateSumEntity entity = new TemplateSumEntity(); |
|
|
|
entity.setCellValue(cellValue); |
|
|
|
entity.setSumKey(getSumKey(cellValue, index++)); |
|
|
|
entity.setCol(cell.getColumnIndex()); |
|
|
|
entity.setRow(cell.getRowIndex()); |
|
|
|
sumMap.put(entity.getSumKey(), entity); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public boolean isSumKey(String key) { |
|
|
|
return sumMap.containsKey(key); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* SUM:(key) |
|
|
|
* |
|
|
|
* @param cellValue |
|
|
|
* @param index |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
private String getSumKey(String cellValue, int index) { |
|
|
|
return cellValue.substring(index + 5, cellValue.indexOf(")", index)); |
|
|
|
} |
|
|
|
|
|
|
|
public void addValueOfKey(String key, String val) { |
|
|
|
if (StringUtils.isNoneEmpty(key)) { |
|
|
|
sumMap.get(key).setValue(sumMap.get(key).getValue() + Double.valueOf(val)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public List<TemplateSumEntity> getDataList() { |
|
|
|
return new ArrayList<TemplateSumEntity>(sumMap.values()); |
|
|
|
} |
|
|
|
|
|
|
|
public void addListSizeToSumEntity() { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
* @param rowIndex |
|
|
|
* @param size |
|
|
|
*/ |
|
|
|
public void shiftRows(int rowIndex, int size) { |
|
|
|
for (TemplateSumEntity entity : getDataList()) { |
|
|
|
if (entity.getRow() > rowIndex) { |
|
|
|
entity.setRow(entity.getRow() + size); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static int indexOfIgnoreCase(String str, String searchStr, int startPos) { |
|
|
|
if (str == null || searchStr == null) { |
|
|
|
return -1; |
|
|
|
} |
|
|
|
if (startPos < 0) { |
|
|
|
startPos = 0; |
|
|
|
} |
|
|
|
int endLimit = (str.length() - searchStr.length()) + 1; |
|
|
|
if (startPos > endLimit) { |
|
|
|
return -1; |
|
|
|
} |
|
|
|
if (searchStr.length() == 0) { |
|
|
|
return startPos; |
|
|
|
} |
|
|
|
for (int i = startPos; i < endLimit; i++) { |
|
|
|
if (str.regionMatches(true, i, searchStr, 0, searchStr.length())) { |
|
|
|
return i; |
|
|
|
} |
|
|
|
} |
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 统计对象 |
|
|
|
* @author JueYue |
|
|
|
*/ |
|
|
|
protected class TemplateSumEntity { |
|
|
|
/** |
|
|
|
* CELL的值 |
|
|
|
*/ |
|
|
|
private String cellValue; |
|
|
|
/** |
|
|
|
* 需要计算的KEY |
|
|
|
*/ |
|
|
|
private String sumKey; |
|
|
|
/** |
|
|
|
* 列 |
|
|
|
*/ |
|
|
|
private int col; |
|
|
|
/** |
|
|
|
* 行 |
|
|
|
*/ |
|
|
|
private int row; |
|
|
|
/** |
|
|
|
* 最后值 |
|
|
|
*/ |
|
|
|
private double value; |
|
|
|
|
|
|
|
public String getCellValue() { |
|
|
|
return cellValue; |
|
|
|
} |
|
|
|
|
|
|
|
public void setCellValue(String cellValue) { |
|
|
|
this.cellValue = cellValue; |
|
|
|
} |
|
|
|
|
|
|
|
public String getSumKey() { |
|
|
|
return sumKey; |
|
|
|
} |
|
|
|
|
|
|
|
public void setSumKey(String sumKey) { |
|
|
|
this.sumKey = sumKey; |
|
|
|
} |
|
|
|
|
|
|
|
public int getCol() { |
|
|
|
return col; |
|
|
|
} |
|
|
|
|
|
|
|
public void setCol(int col) { |
|
|
|
this.col = col; |
|
|
|
} |
|
|
|
|
|
|
|
public int getRow() { |
|
|
|
return row; |
|
|
|
} |
|
|
|
|
|
|
|
public void setRow(int row) { |
|
|
|
this.row = row; |
|
|
|
} |
|
|
|
|
|
|
|
public double getValue() { |
|
|
|
return value; |
|
|
|
} |
|
|
|
|
|
|
|
public void setValue(double value) { |
|
|
|
this.value = value; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |