package com.basesoft.modules.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.basesoft.modules.excel.config.Config;
import com.basesoft.util.StringUtil;
/**
* Excel转化为JOSN字符串
*
*
*/
public class ExcelToJSON {
/**
* Excel转化为JOSN字符串
* @param is
* @param config
* @return
* @throws BiffException
* @throws IOException
* @throws JSONException
*/
public static JSONObject parse(InputStream is, JSONObject config) throws BiffException, IOException, JSONException {
JSONObject data = new JSONObject();
data.put("table", config.optJSONObject("head").optString("table"));
Workbook wb = Workbook.getWorkbook(is);
Sheet[] sheets = wb.getSheets();
Sheet sheet = wb.getSheet(0);
int row = config.optJSONObject("head").optInt("row");
int col = config.optJSONObject("head").optInt("col");
String type = config.optJSONObject("head").optString("type");
String count = config.optJSONObject("head").optString("count");
String split = config.optJSONObject("head").optString("split");
JSONArray relation = config.optJSONObject("body").optJSONArray("relation");
if(relation == null){
relation = new JSONArray();
relation.put(config.optJSONObject("body").optJSONObject("relation"));
}
data.put("row", excelToJSON(sheets, row, col, relation, type, count, split));
wb.close();
return data;
}
/**
* 数据行的转换
* @param sheet
* @param row 起始行
* @param col 起始列
* @param relation 配置关系
* @param type 模板种类
* @param count 一行拆分为几条数据
* @param split 每条数据占几列
* @return
* @throws JSONException
*/
private static JSONArray excelToJSON(Sheet[] sheets, int row, int col, JSONArray relation, String type, String count, String split) throws JSONException {
JSONArray jsonArray = new JSONArray();
for(int s=0;s<sheets.length;s++){
Sheet sheet = sheets[s];
//没有拆分
if ("1".equals(type)) {
for (int i = 0; i < sheet.getRows() - row + 1; i ++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("ID", i + 1); //加上序号
int size = 0;
if(sheet.getColumns() - col + 1>relation.length()){//当excel文件中列数多余配置的列数时,按配置文件中的列数取
size = relation.length();
}else {//当excel文件中列数少于配置的列数时,按excel文件中的列数取
size = sheet.getColumns() - col + 1;
}
for (int j = 0; j < size; j ++) {
int id = relation.optJSONObject(j).optInt("id");
String column = relation.optJSONObject(j).optString("column");
jsonObject.put(column, getCellContents(sheet.getCell(col - 1 + id - 1, i + row - 1), relation.optJSONObject(j).optString("format"))); //所有数据以字符串的形式存放
}
jsonArray.put(jsonObject);
}
//有拆分
} else if("2".equals(type)) {
int countInt = Integer.parseInt(count);
int splitInt = Integer.parseInt(split);
for (int i = 0; i < sheet.getRows() - row + 1; i ++) {
for (int j = 0; j < countInt; j ++) { //一行分几条 循环
JSONObject jsonObject = new JSONObject();
jsonObject.put("ID", i * countInt + j + 1); //加上序号
int dateId = relation.optJSONObject(0).optInt("id");
String dateColumn = relation.optJSONObject(0).optString("column");
jsonObject.put(dateColumn, getCellContents(sheet.getCell(col - 1 + dateId - 1, i + row - 1), relation.optJSONObject(0).optString("format"))); //所有数据以字符串的形式存放
int ListId = relation.optJSONObject(1).optInt("id");
String ListColumn = relation.optJSONObject(1).optString("column");
jsonObject.put(ListColumn, relation.optJSONObject(1).optString("format").split("/")[j]); //所有数据以字符串的形式存放
for (int k = 0; k < splitInt; k ++) { //每条数据循环的列数
int id = relation.optJSONObject(k + 2).optInt("id");
String column = relation.optJSONObject(k + 2).optString("column");
jsonObject.put(column, getCellContents(sheet.getCell(j * splitInt + col - 1 + id - 1, i + row - 1), relation.optJSONObject(k + 2).optString("format"))); //所有数据以字符串的形式存放
}
for (int k = 0; k < sheet.getColumns() - col + 1 - 1 - countInt * splitInt; k ++) { //之后公用的字段
int id = relation.optJSONObject(k + 2 + splitInt).optInt("id");
String column = relation.optJSONObject(k + 2 + splitInt).optString("column");
jsonObject.put(column, getCellContents(sheet.getCell(col - 1 + id - 1, i + row - 1), relation.optJSONObject(k + 2 + splitInt).optString("format"))); //所有数据以字符串的形式存放
}
jsonArray.put(jsonObject);
}
}
}
}
return jsonArray;
}
/**
* 取一个单元格的内容
* @param cell
* @return
*/
private static String getCellContents(Cell cell, String format) {
String ret = "";
if("yyyy-MM-dd".equals(format)||"yyyy-MM-dd hh24:mi:ss".equals(format)){
if(cell.getType() == CellType.DATE){
DateCell dateCell = (DateCell) cell;
ret = StringUtil.DateToString(dateCell.getDate(), format);
}else if(cell.getType() == CellType.LABEL){
ret = cell.getContents();
}else if(cell.getType() == CellType.NUMBER){
NumberCell numCell = (NumberCell) cell;
Double num = numCell.getValue();
ret = StringUtil.changeNumToDate(String.valueOf(num.intValue()));
}else {
ret = StringUtil.changeNumToDate(cell.getContents());
}
} else {
ret = cell.getContents();
}
return ret;
}
public static void main(String []args) throws BiffException, FileNotFoundException, IOException, JSONException {
String XML_PATH = java.net.URLDecoder.decode(ExcelToJSON.class.getResource("").getPath());
File file = new File(XML_PATH + "【稻纵卷叶螟田间赶蛾调查表】批量导入模板.xls");
JSONObject config_Conversion = Config.getJSONObjectByName("DZJYMTJGEDCB_Conversion");
JSONObject data = ExcelToJSON.parse(new FileInputStream(file), config_Conversion);
}
}