Задать вопрос
@tr1ck1

Почему при считывании файла excel у числа вместо «.» записывается «,»?

Привет всем. Считываю xls файл, есть колонка (формат числовой), в которой значения через точку.
5ee162369f7f2098747657.jpeg

Затем загружаю файл в groovy (проще говоря, та же java, кто незнаком) и значение заносится через запятую, после чего крашится вся программа, так как нужно получить данные через точку, которые потом обрабатываются. Как исправить?

Фрагмент кода:
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

        // идем по листам в файле
        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()!='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 = 0.00);
                                    break;
                                case 3:
                                    hm.put("rep_date", value);
                                    break;
                            }
                            numCell = numCell + 1;

                        }

                    }
                }
                if(hm) arrAllData.add(hm);
                cntStr = cntStr + 1;
            }
        }

        for (int i = 1; i < arrAllData.size(); i++) {
            HashMap <String, String> hm = arrAllData.get(i);
  • Вопрос задан
  • 264 просмотра
Подписаться 1 Простой 8 комментариев
Решения вопроса 1
@tr1ck1 Автор вопроса
DataFormatter formatter = new DataFormatter(Locale.US);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Chitinets
100% из-за региональных настроек в Win, по дефолту там стоит запятая
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Это самая распространенная ошибка практически везде.
Вот так выглядят числа в en_US и ru_RU
1,000.00
1 000,00
Поэтому используйте правильную локаль.
https://howtodoinjava.com/java/date-time/java-loca...

Кроме того, при отправке в БД тоже проверяйте в каком формате данные, или вас ждут крайне неприятные сюрпризы типа: А у меня все работало!
Ответ написан
@khlkolan
5ee7405aab812257719690.jpeg
заходишь в настройки групповых политик, создаешь политику применяемую к группам или отдельным пользователям... переходишь в региональные настройки, там все будет выделено в красный квадрат, выбераешь что нужно изменить (в твоем случае запятую поменять на точку) нажимаешь F5 и спокойно можешь менять... т.к если будет выделено красным, политика не примениться!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы