Привет всем. Есть excel файл, в нем 3 колонки. Если значение в 1 и 2 колонке повторяются в нескольких строках, то должна выдаваться ошибка. Если была бы одна колонка, было бы проще, но так как значения в двух должны совпадать, то не могу понять. Думал сделать цикл в цикле, но полагаю, что не лучший вариант) Читал про poi, но не совсем разобрался, как это реализовать. Как это сделать в коде правильно?
import groovy.sql.Sql
import java.sql.Connection
import java.sql.DriverManager
import org.apache.poi.ss.usermodel.*
import org.apache.poi.hssf.usermodel.*
class XM_PARSE_XLS {
def execute(Connection conn, InputStream p_file, String p_filename) {
Sql sql = new Sql(conn);
HSSFWorkbook wb = new HSSFWorkbook(p_file);
ArrayList<HashMap<String, String>> arrAllData = new ArrayList<HashMap<String, String>>();
String strsql
Integer cntStr = 0
String z_code_list = ""
String cl_code_list = ""
// парсим строку названия файла p_filename (первые 4 числа в гггг, следующие 2 числа в мм
String PYYYY = p_filename.substring(0, 4);
String PMM = p_filename.substring(4, 6);
// идем по листам в файле
wb.each { HSSFSheet myExcelSheet ->
DataFormatter formatter = new DataFormatter();
// идем по страницам файла
myExcelSheet.each{ Row myrow ->
HashMap<String, String> hm = new HashMap<String, String>();
if (cntStr >= 0) {
// идем по строкам с данными
Integer numCell = 0;
String typ = '';
myrow.each { Cell mycell ->
String value = ""; // приводит любые ячейки к строковому формату
// если тип Строка
if (mycell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
value = mycell.getStringCellValue();
typ = 'S'
// если тип число
} else {
// а для числовых ячеек или ячеек даты значение будет отформатировано на основе правил форматирования / стиля, примененных к ячейке, а затем возвращено как строка
value = formatter.formatCellValue(mycell);
typ = 'N'
}
if (cntStr == 0) {
Boolean Err = false;
switch(numCell) {
case 0:
Err=(value.toUpperCase()!='Код завода');
break;
case 1:
Err=(value.toUpperCase()!='Код клиента');
break;
case 2:
Err=(value.toUpperCase()!='Описание');
break;
}
numCell = numCell + 1;
if (Err) {
throw new Exception("Неверный заголовок столбца "+ value)
}
} else {
if((typ!='S')&&(numCell>0)&&(numCell<2)){
throw new Exception("Неверные данные для загрузки "+ value)
}
switch(numCell) {
case 0:
hm.put("z_code", value);
break;
case 1:
hm.put("cl_code", value);
break;
case 2:
hm.put("desc", value);
break;
}
numCell = numCell + 1;
}
}
}
if(hm) arrAllData.add(hm);
cntStr = cntStr + 1;
}
}
for (int i = 0; i < arrAllData.size(); i++) {
HashMap <String, String> hm = arrAllData.get(i);
if ("".equals(z_code_list)) {
z_code_list = hm?.z_code}
else{
z_code_list = z_code_list+";"+hm?.z_code}
if ("".equals(cl_code_list)) {
cl_code_list = hm?.cl_code}
else{
cl_code_list = cl_code_list+";"+hm?.cl_code}
strsql = """plsql code
""";
sql.execute( strsql);
}
HashMap<String, Object> res = new HashMap<>();
res.put("P_CNT",cntStr-1);
res.put("P_SQL",strsql);
res.put("PYYYY",PYYYY);
res.put("PMM",PMM);
res.put("P_Z_CODE_LIST",z_code_list);
res.put("P_CL_CODE_LIST",cl_code_list);
return res;
}
static void main(String... args) {
}
}