Получение значения ячейки из файла excel с форматом

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

Чтобы взять тот же формат из исходного файла excel, я использую HSSFCellStyle .

Это мой код:

Частные объявления:

 private HSSFRow row1; private HSSFCell cell1; private HSSFCellStyle cellStyle1; private FileInputStream inFile1,inFile2; private HSSFSheet excelSheet1=null,excelSheet2=null; private HSSFWorkbook excelBook1=null,excelBook2=null; 

Основной метод:

 public static void main(String args[]){ appendToExcelClass test = new appendToExcelClass(); test.appendToExcel(new File("C:\\excel1.xls"),new File("C:\\excel2.xls")); } 

Способ добавления содержимого:

 public void appendToExcel(File file1,File file2){ try{ if(file1.exists() && file2.exists()){ inFile1 = new FileInputStream(file1); inFile2 = new FileInputStream(file2); excelBook1 = new HSSFWorkbook(inFile1); excelBook2 = new HSSFWorkbook(inFile2); excelSheet1 = excelBook1.getSheetAt(0); excelSheet2 = excelBook2.getSheetAt(0); Iterator rowIter = excelSheet2.rowIterator(); while(rowIter.hasNext()){ HSSFRow myRow = (HSSFRow) rowIter.next(); Iterator cellIter = myRow.cellIterator(); List<String> cellStoreVector; cellStoreVector = new ArrayList<>(); while(cellIter.hasNext()){ HSSFCell myCell = (HSSFCell) cellIter.next(); String cellvalue = myCell.getStringCellValue(); cellStyle1 = myCell.getCellStyle(); /*The problem is in this part, I think I didn't get well how get the cell's format*/ cellStoreVector.add(cellvalue); } row1 = excelSheet1.createRow(excelSheet1.getLastRowNum()+1); cell1 = row1.createCell(0); cell1.setCellStyle(cellStyle1); /*At the moment to execute this part, it throws this: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a different workbook?*/ cell1.setCellValue(cellStoreVector.get(0).toString()); } FileOutputStream outFile1 = new FileOutputStream(file1); excelBook1.write(outFile1); outFile1.close(); } }catch(Exception ex){ ex.printStackTrace(); } } в public void appendToExcel(File file1,File file2){ try{ if(file1.exists() && file2.exists()){ inFile1 = new FileInputStream(file1); inFile2 = new FileInputStream(file2); excelBook1 = new HSSFWorkbook(inFile1); excelBook2 = new HSSFWorkbook(inFile2); excelSheet1 = excelBook1.getSheetAt(0); excelSheet2 = excelBook2.getSheetAt(0); Iterator rowIter = excelSheet2.rowIterator(); while(rowIter.hasNext()){ HSSFRow myRow = (HSSFRow) rowIter.next(); Iterator cellIter = myRow.cellIterator(); List<String> cellStoreVector; cellStoreVector = new ArrayList<>(); while(cellIter.hasNext()){ HSSFCell myCell = (HSSFCell) cellIter.next(); String cellvalue = myCell.getStringCellValue(); cellStyle1 = myCell.getCellStyle(); /*The problem is in this part, I think I didn't get well how get the cell's format*/ cellStoreVector.add(cellvalue); } row1 = excelSheet1.createRow(excelSheet1.getLastRowNum()+1); cell1 = row1.createCell(0); cell1.setCellStyle(cellStyle1); /*At the moment to execute this part, it throws this: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a different workbook?*/ cell1.setCellValue(cellStoreVector.get(0).toString()); } FileOutputStream outFile1 = new FileOutputStream(file1); excelBook1.write(outFile1); outFile1.close(); } }catch(Exception ex){ ex.printStackTrace(); } } в public void appendToExcel(File file1,File file2){ try{ if(file1.exists() && file2.exists()){ inFile1 = new FileInputStream(file1); inFile2 = new FileInputStream(file2); excelBook1 = new HSSFWorkbook(inFile1); excelBook2 = new HSSFWorkbook(inFile2); excelSheet1 = excelBook1.getSheetAt(0); excelSheet2 = excelBook2.getSheetAt(0); Iterator rowIter = excelSheet2.rowIterator(); while(rowIter.hasNext()){ HSSFRow myRow = (HSSFRow) rowIter.next(); Iterator cellIter = myRow.cellIterator(); List<String> cellStoreVector; cellStoreVector = new ArrayList<>(); while(cellIter.hasNext()){ HSSFCell myCell = (HSSFCell) cellIter.next(); String cellvalue = myCell.getStringCellValue(); cellStyle1 = myCell.getCellStyle(); /*The problem is in this part, I think I didn't get well how get the cell's format*/ cellStoreVector.add(cellvalue); } row1 = excelSheet1.createRow(excelSheet1.getLastRowNum()+1); cell1 = row1.createCell(0); cell1.setCellStyle(cellStyle1); /*At the moment to execute this part, it throws this: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a different workbook?*/ cell1.setCellValue(cellStoreVector.get(0).toString()); } FileOutputStream outFile1 = new FileOutputStream(file1); excelBook1.write(outFile1); outFile1.close(); } }catch(Exception ex){ ex.printStackTrace(); } } 

Я не уверен в той части, которая бросает мне ошибку.

Заранее спасибо.

Сообщение об ошибке в значительной степени объясняет проблему. HSSFWorkbook содержит таблицу всех стилей, которые вы можете использовать. Всякий раз, когда вы вызываете setCellStyle, HSSFCellStyle, который вы передаете, должен находиться в этой таблице. Случилось так, что HSSFCellStyle, который вы извлекли из ячейки в excelBook2, не существует в excelBook1.

Чтобы исправить это, вы можете вызвать excelBook1.createCellStyle для создания нового стиля и клонировать его атрибуты из извлеченного стиля. Вот пример того, как это сделать.

 HSSFCellStyle newStyle = excelBook1.createCellStyle(); newStyle.cloneStyleFrom(cellStyle1); 

Я отправляю этот второй ответ, потому что я думаю, что первый ответ, хотя и неполный, полезен. Основная проблема заключается в том, что я определил в первом ответе – в каждой книге есть таблица связанных стилей, и вы должны убедиться, что все стили из excelBook2 также присутствуют в excelBook1.

Однако, большая проблема заключается в том, как вы знаете, какие стили из excelBook2 отсутствуют в excelBook1? Вот две ссылки, которые объясняют проблему более подробно:

Почему клонированный HSSFCellStyle не соответствует стилю, который был клонирован?

http://apache-poi.1045710.n5.nabble.com/HSSFCellStyle-help-td2295062.html

Теперь позвольте мне изложить мое предложение о том, что вам нужно сделать, чтобы преодолеть эту проблему.

a) Напишите метод со следующим следом:

 public boolean stylesAreEquivalent(HSSFCellStyle style1, HSSFCellStyle style2) 

В этом методе вы сравниваете каждое свойство в стиле1 с тем же свойством в стиле2. Это включает выравнивание, стили границ, значения rgb различных цветов, имя шрифта, размер шрифта и т. Д. Метод возвращает true, если все базовые свойства одинаковы в обоих стилях.

b) Создайте следующий HashMap

 HashMap<short,HSSFCellStyle> book2Styles = new HashMap<short,HSSFCellStyle>(); 

Эта карта будет проиндексирована по значению, полученному вами из HSSFCellStyle.getIndex ().

c) Получите стиль из ячейки, которую вы хотите скопировать из book2 в book1. Получите его индекс, используя getIndex. Выполните следующий код:

 HSSFCellStyle styleFromMap = book2Styles.get(index); 

Если styleFromMap не равен null, перейдите к шагу d) ниже.

Если styleFromMap имеет значение NULL, то вам нужно выяснить, существует ли уже эквивалентный стиль в book1, который вы можете использовать. Вы можете узнать это, вызвав метод stylesAreEquivalent для каждого стиля в book1, чтобы узнать, не совпадают ли они. Если есть совпадение, выполните следующий код:

 book2Styles.put(index, equivalentBook1Style); styleFromMap = equivalentBook1Style; 

Если нет эквивалентного стиля, вам нужно создать новый стиль и клонировать его, используя код из моего предыдущего ответа.

 HSSFCellStyle newStyle = excelBook1.createCellStyle(); newStyle.cloneStyleFrom(cellStyle1); book2Styles.put(index, newStyle); styleFromMap = newStyle; 

d) Скопируйте ячейку из book2 в book1, используя стиль в стилеFromMap.

Использование подхода позволит свести к минимуму количество новых стилей, которые вы должны создать в book1. Поскольку существует ограничение в 400 стилей, это важно.

Я бы хотел, чтобы был более простой способ, но это определенно выполнимо и не будет такого большого количества кода.

  • как читать точное содержимое ячейки файла excel в apache POI
  • Как получить цвет фона ячейки с помощью apache poi?
  • Java написать csv-String в Excel
  • как разобрать сложный лист excel с большим количеством объединенных и разделенных ячеек
  • Функция Excel STEYX для Java
  • Excel Сбрасывание с использованием DataValidationHelper (POI)
  • Получить данные из файла excel - JSF
  • Как разделить данные на листе Excel, которые имеют разные пробелы
  • Чтение надстрочного текста excel с помощью Apache POI в Java
  • Apache POI XSSFCell не принимает Cell.CellType в качестве аргумента
  • Преобразование сложного excel, содержащего изображения, рисунки в pdf с использованием java
  • Interesting Posts

    Программное усечение больших имен файлов (zipped) для разных выпусков Windows

    Как сделать Selection.AutoFilter начинается в строке 3 вместо строки 1

    (Excel) Предоставление диапазона ячеек такого же цвета, как условно отформатированные соседние ячейки

    Выделите значения Excel

    ExcelNewbie: сопоставление информации о ячейке по рабочим листам

    Чтение всех файлов в папке и отображение содержимого в Excel

    Как использовать COUNTIFS или ANOTHER METHOD для подсчета дубликатов заданного диапазона на другом листе

    Экспорт в Excel не работает на главном сервере

    Вставка новых строк и перемещение существующих с помощью OpenXML SDK 2.0

    VBA Verify Расширение файла как файл excel?

    Ошибка доступа к пути / файлу Время выполнения 75 – VBA

    SSIS Excel Import – переменная рабочего листа или шаблон?

    Недостаточно памяти или размер слишком большой для типа индекса Octave (чтение xlsx-файла)

    экспортировать в Excel из списка с EPPLUS

    Выберите сначала «Пустое ячеие» из выбранной ячейки (или диапазона), затем добавьте значение (дата), затем смещение и inputext

    Давайте будем гением компьютера.