Привет всем, почему replace заменяет точки на запятые, еще что угодно, но не убирает пробелы? Проблема в том, что в excel стоит разделитель группы разрядов и число считывается, как 3 535 174,10, а нужно, чтобы считывалось, как 3535174,10
Есть кто знает и может практически указать на ошибку? Несколько дней не могу уже разобраться.
п.с. просьба не советовать менять локаль.
п.с.с. а еще лучше, как считать значения без этих пробелов, чтобы не использовать реплейс? так понимаю, что нужно метод заменить, чтобы читал число внутри ячейки, а не поверхностно? value = formatter.formatCellValue(mycell);
import groovy.sql.Sql
import java.sql.Connection
import java.sql.DriverManager
import org.apache.poi.ss.usermodel.*
import org.apache.poi.hssf.usermodel.*
import java.text.DecimalFormat
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 els_list = ""
String st_code_list = ""
String rep_date_list = ""
// идем по листам в файле
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);
value = value.replace(' ',''); //убрать пробелы, тут же ставил replace (',','.') и заменял запятую на точку, а пробелы игнорирует
typ = 'N'
}
if (cntStr == 0) {
Boolean Err = false;
switch(numCell) {
case 0:
Err=(value.toUpperCase()!='ELS');
break;
case 1:
Err=(value.toUpperCase()!='ST_CODE');
break;
case 2:
Err=(value.toUpperCase()!='SUMMA');
break;
case 3:
Err=(value.toUpperCase()!='REP_DATE');
break;
}
numCell = numCell + 1;
if (Err) {
throw new Exception("Неверный заголовок столбца "+ value)
}
} else {
if( (typ!='N') && (numCell>0)&&(numCell<3) ){
throw new Exception("Неверные данные для загрузки "+ value)
}
switch(numCell) {
case 0:
hm.put("els", value);
break;
case 1:
hm.put("st_code", value);
break;
case 2:
hm.put("summa", value); //здесь не убирает пробелы
break;
case 3:
hm.put("rep_date", 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(els_list)) {
els_list = hm?.els}
else{
els_list = els_list+";"+hm?.els}
if ("".equals(st_code_list)) {
st_code_list = hm?.st_code}
else{
st_code_list = st_code_list+";"+hm?.st_code}
if ("".equals(rep_date_list)) {
rep_date_list = hm?.rep_date}
else{
rep_date_list = rep_date_list+";"+hm?.rep_date}
strsql = """pl/sql code
""";
sql.execute( strsql);
}
HashMap<String, Object> res = new HashMap<>();
res.put("P_CNT",cntStr-1);
res.put("P_SQL",strsql);
res.put("P_ELS_LIST",els_list);
res.put("P_ST_CODE_LIST",st_code_list);
res.put("P_REP_DATE_LIST",rep_date_list);
return res;
}
static void main(String... args) {
Class.forName("oracle.jdbc.driver.OracleDriver")
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@ip:port/OLAP2", "name", "password")
connection.setAutoCommit(true)
try {
def file = new File("201408_teo.xls").newInputStream()
def SSC = new XM_PARSE_XLS()
def res = SSC.execute(connection,file,"201408_teo.xls")
} finally {
connection.close()
}
}