С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/48: Рейтинг темы: голосов - 48, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16

Копирование стиля ячеек excel с использованием apach poi

29.09.2014, 17:08. Показов 9307. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Очень нужна помощь.
Есть следующий метод. Все работало хорошо, пока данных не оказалось очень много. Теперь он выдает

Java
1
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook
Вынести за цикл не получается. Подскажите,что еще можно сделать и как переделать метод?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
     * Установить обработанное значение ячейке
     * @param curRow   обрабатываемая ячейка
     * @param templStyleRow ячейка со стилями
     * @param templValueRow ячейка с шаблонной строкой
     * @param colCount количество обрабатываемых ячеек 
     */
    private void setParsedValuesToRow(HSSFWorkbook workBook, HSSFSheet sheet,int curRowInd,Row templStyleRow, Row templValueRow,int colCount){
    //private void setParsedValuesToRow(HSSFSheet sheet,int curRowInd,Row templStyleRow, Row templValueRow,int colCount){
        //создаем строку в листе
            
        sheet.createRow(curRowInd);
        
        //обрабатываемая строка таблицы
        Row curRow = sheet.getRow(curRowInd);
    //  System.out.println("colCount="+colCount);
        //создаем ячейки строки 
        for(int j=0;j<colCount;j++)
            curRow.createCell(j);
        
        //из листа стиля устанавливаем высоту строки
        curRow.setHeightInPoints(templStyleRow.getHeightInPoints());
        
        //копирование стилей ячеек и обработка значений из шаблонной строки
        for(int i=0;i< colCount;i++){
    
            //копируем в ячейку пропарсенное из шаблона значение
            if((curRow.getCell(i) != null)&&(templStyleRow.getCell(i) != null)&&(templValueRow.getCell(i) != null))
                setParsedValueToCell(curRow.getCell(i), templStyleRow.getCell(i),templValueRow.getCell(i));
            System.out.println("i="+i);
            //КЛОНИРУЕМ в ячейку соответствующий стиль
    
            if((templStyleRow.getCell(i) != null)&&(curRow.getCell(i) != null)){
                //создаем стиль
                CellStyle cloneStyle; 
                cloneStyle = workBook.createCellStyle();// ошибка выдается тут
            
                //клонируем в книгу стиль
                cloneStyle.cloneStyleFrom(templStyleRow.getCell(i).getCellStyle());
                
                //присваиваем стиль уже из родной книги
                curRow.getCell(i).setCellStyle(cloneStyle);
            }
            
        }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.09.2014, 17:08
Ответы с готовыми решениями:

Apache POI, диапазон ячеек
Как покрасить диапазон ячеек?

Apach POI работа с Drawing
Мне необходимо открыть Excel-файл с комментариями и добавить комментарий в несколько ячеек. Проблема в том, что иногда способа создать...

Apache POI Exel копирование строки
Всем привет. Пишу программку, смысл такой: Есть файл .xls, в котором 2 страницы, одна заполнена таблицей, вторая пустая. Нужно в...

22
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
29.09.2014, 18:30
Встречал такую ошибку Сам ловил. Это проблема того что книга Excel может хранить только 4000 уникальных стилей для ячеек.

Ты создаешь CellStyle cloneStyle; внутри циклов. В итоге много ячеек, много стилей. Если у тебя cloneStyle один для всех ячеек, то вынеси его создание за циклы.
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
30.09.2014, 09:44  [ТС]
В чем проблема я знаю, но вот как ее решить? За цикл пробовала выносить, в итоге вот такая картинка получается

выносила так

Java
1
2
3
4
5
6
7
8
9
10
    //создаем ячейки строки 
        for(int j=0;j<colCount;j++)
            curRow.createCell(j);
        
        //из листа стиля устанавливаем высоту строки
        curRow.setHeightInPoints(templStyleRow.getHeightInPoints());
        CellStyle cloneStyle; //перенесла
        cloneStyle = workBook.createCellStyle();//перенесла
        //копирование стилей ячеек и обработка значений из шаблонной строки
        for(int i=0;i< colCount;i++){
Миниатюры
Копирование стиля ячеек excel с использованием apach poi  
0
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
30.09.2014, 10:35
Тебе не нравится решетки в ячейках?
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
30.09.2014, 10:45  [ТС]
ну как бы да Плюс к этому летят все стили в других шаблонах
0
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
30.09.2014, 10:50
Решетки это всего лишь говорит о том что длина значения ячейки больше чем длина ячейки. Используй sheet.autoSizeColumn(indexColumn);
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
30.09.2014, 10:53  [ТС]
не помогает и я ж добавила еще что все стили ячеек в других шаблонах теряются
0
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
01.10.2014, 01:10
если я правильно понял, то у тебя у каждого столбца свой стиль. Как вариант создать лист стилей которые надо взять шаблона.
И получается у тебя индекс ячейки будет индексом стиля в листе. Получается тогда у тебя если 10 столбцов, то будет всего 10 стилей. а не 4000 и более.
1
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
02.10.2014, 13:56  [ТС]
Если я правильно поняла, то вот код,все равно получается тоже самое.Для заполнения листа без цикла не получается обойтись. И я не могу добавить 10 или 5 стилей, у меня в разных шаблонах получается разное количество столбцов. При чем метод вызывается при заполнении каждой ячейки значением.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void setParsedValuesToRow(HSSFWorkbook workBook, HSSFSheet sheet,int curRowInd,Row templStyleRow, Row templValueRow,int colCount){
    //private void setParsedValuesToRow(HSSFSheet sheet,int curRowInd,Row templStyleRow, Row templValueRow,int colCount){
        //создаем строку в листе
            ArrayList<CellStyle> listStyle = new ArrayList<CellStyle>();
            
            CellStyle cloneStyle; 
            
    
            for (int i=0;i<colCount;i++) {
                cloneStyle = workBook.createCellStyle();
                listStyle.add(cloneStyle);
            }
            sheet.createRow(curRowInd);
    
        //обрабатываемая строка таблицы
        Row curRow = sheet.getRow(curRowInd);
0
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
02.10.2014, 14:20
Не отвечаю за работоспособность, но попробуй так.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    private final List<CellStyle> cellStyleList = new ArrayList();
 
    private void setParsedValuesToRow(HSSFWorkbook workBook, HSSFSheet sheet, int curRowInd, Row templStyleRow, Row templValueRow, int colCount) {
        //private void setParsedValuesToRow(HSSFSheet sheet,int curRowInd,Row templStyleRow, Row templValueRow,int colCount){
        //создаем строку в листе
 
        sheet.createRow(curRowInd);
 
        //обрабатываемая строка таблицы
        Row curRow = sheet.getRow(curRowInd);
        //  System.out.println("colCount="+colCount);
        //создаем ячейки строки 
        for (int j = 0; j < colCount; j++) {
            curRow.createCell(j);
        }
 
        //из листа стиля устанавливаем высоту строки
        curRow.setHeightInPoints(templStyleRow.getHeightInPoints());
 
        //копирование стилей ячеек и обработка значений из шаблонной строки
        for (int i = 0; i < colCount; i++) {
 
            //копируем в ячейку пропарсенное из шаблона значение
            if ((curRow.getCell(i) != null) && (templStyleRow.getCell(i) != null) && (templValueRow.getCell(i) != null)) {
                setParsedValueToCell(curRow.getCell(i), templStyleRow.getCell(i), templValueRow.getCell(i));
            }
            System.out.println("i=" + i);
            //КЛОНИРУЕМ в ячейку соответствующий стиль
 
            if ((templStyleRow.getCell(i) != null) && (curRow.getCell(i) != null)) {
                //создаем стиль
 
                CellStyle tempStyle = templStyleRow.getCell(i).getCellStyle();
                CellStyle cloneStyle = null;
                for (CellStyle findCellStyle : cellStyleList) {
                    if (tempStyle.equals(findCellStyle)) {
                        cloneStyle = findCellStyle;
                        break;
                    }
                }
                if (cloneStyle == null) {
                    cloneStyle = workBook.createCellStyle();// ошибка выдается тут
 
                //клонируем в книгу стиль
                    cloneStyle.cloneStyleFrom(templStyleRow.getCell(i).getCellStyle());
                    cellStyleList.add(cloneStyle);
                }
 
 
                //присваиваем стиль уже из родной книги
                curRow.getCell(i).setCellStyle(cloneStyle);
            }
 
        }
    }
1
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
02.10.2014, 15:31  [ТС]
все стабильно,ошибка выдается на том же месте
0
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
02.10.2014, 15:35
Когда ошибку ловишь, сколько итемов лежит в cellStyleList?
1
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
02.10.2014, 15:43  [ТС]
cellStyleList=3931
потом еще чего то продолжает делать и в конце
cellStyleList=3940
0
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
02.10.2014, 15:45
ну так отлично. тебе надо правильно реализовать сравнение tempStyle и findCellStyle. И должно заработать.
1
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
02.10.2014, 16:10  [ТС]
хм...подправила вот так,вроде работает...

Java
1
if ((tempStyle.equals(findCellStyle))||(cellStyleList.size()==3940))


не долго работает))

пока условие выполняется выводит стиль как надо, а потом стили теряются, надо что-то другое
0
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
02.10.2014, 16:19
ты не поняла. надо по каким нибудь свойствам объектов tempStyle и findCellStyle сравнить их. и если они похожи, то не создавать новый стиль, а взять уже готовый из листа cellStyleList.
1
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
02.10.2014, 17:40  [ТС]
блин, до меня только дошло,что в if вообще не заходит...жесть, чет я не соображу как еще можно сравнить
0
185 / 160 / 49
Регистрация: 30.07.2013
Сообщений: 508
02.10.2014, 21:46
Ну или еще вариант. Вместо HSSFWorkbook используй SXSSFWorkbook. Только учти на выходе у тебя получится не xls, а xlsx. Надеюсь этого объяснять не надо?
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 16
03.10.2014, 09:32  [ТС]
этот вариант мне абсолютно не подходит, народ работает с .xls и все шаблоны в этом же формате
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
03.10.2014, 11:22
MarinaSergeevna, а вы незаметно замените на xlsx. Даже расширение можно оставить старое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2014, 11:22
Помогаю со студенческими работами здесь

Переделать программу с использованием poi
Здравствуйте, помогите пожалуйста переделать программу под библиотеку poi. Программа должна брать данные из exel и рассчитывать...

Копирование ячеек Excel
Доброго дня, столкнулся с проблемой, не могу понять почему выпадает исключение, собственно есть код, который открывает 2 Excel файла и из...

Копирование диапазона ячеек из Excel в Word
Приветствую. Уважаемые, столкнулся с проблемой копированя диапазона ячеек из Excel в Word. Имеется лист Экселя который...

Копирование ячеек из книги excel в таблицу access
Здравствуйте. Подскажите, пожалуйста, как с помощью vba скопировать ячейки из книги excel в таблицу access. и можно ли подключить...

Копирование листа excel с сохранением формата ячеек
Добрый день! Копирую лист с одного excel файла в другой вот таким способом: vTemp=wSheet1.OlePropertyGet(&quot;Range&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru