Невозможно записать значения в Excel, используя несколько методов workbook.write. - PullRequest
0 голосов
/ 09 января 2019

Приведенный ниже код работает без каких-либо ошибок во время выполнения, если я вызываю метод owb.write(fileOut) и fileOut.close() только один раз в конце (с комментариями write and close positioning), но проблема здесь заключается в том, что первое значение устанавливается при k=1, не печатается в рабочей книге. Он отлично работает, когда итерация находится в других столбцах и k=1. Только первая итерация не печатается. Остальные значения установлены правильно.

Я пытался использовать несколько workbook.write() метод. Если вы посмотрите на приведенный ниже код с комментариями [1], мне пришлось вызывать owb.write(fileOut) отдельно в условиях if (с комментариями if condition[1]) и else (с комментариями else condition [2]), поскольку я сказал, первое значение не было установлено в книге. Я получаю следующую ошибку времени выполнения при попытке выполнить код в этом сценарии:

Не удалось сохранить: при сохранении пакета произошла ошибка: не удалось сохранить часть /docProps/app.xml в потоке с маршаллером org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@3740f768

       for(int i=0;i<noOfCols1;i++)
        {
        	for(int j=1;j<=noOfRows1;j++)
        	{
        		value1 = formatter.formatCellValue(sheet1.getRow(j).getCell(i));
        			for(int m=1;m<=noOfRows2;m++)
        			{
        				value2 = formatter.formatCellValue(sheet2.getRow(m).getCell(i));
        				value1= value1.trim();
        				value2=value2.trim();
        				int value2Position = sheet2.getRow(m).getCell(i).getRowIndex();
        				if(!positions.contains(value2Position))
        				{
        				 if(value1.contentEquals(value2))
        				 {
        					positions.add(value2Position);
        					matched = true;
        				 }
        				 else{
        					 matched = false;
        				 }
        				}
        				if(matched==true)
        				{
        					break;
        				}
        			}
        			if(matched == false)
        			{   
        				int k=1;
        				if(cFilledPositions.isEmpty())   //If condition[i]
        				{
        					rowHead =  sheet.createRow((short)k);
            				rowHead.createCell(i).setCellValue(value1);
            				owb.write(fileOut);   //[1]
        				}
        				else     //else condition [1]
        				{
        					int l = cFilledPositions.size()-1; 
        						k = cFilledPositions.get(l)+1;
        						rowHead =  sheet.createRow((short)k);
                				rowHead.createCell(i).setCellValue(value1);
                				owb.write(fileOut);
        				}
        				cFilledPositions.add(k);	
             		}
        			matched = false;
        	}
        	cFilledPositions.clear();
        	positions.clear(); 
        }
               //write and close positioning
        fileOut.close();

1 Ответ

0 голосов
/ 09 января 2019

Я попытался отладить и обнаружил, что метод createRow () удаляет ранее созданные значения при повторном вызове в той же строке.

Чтобы уточнить это, предположим, что sheet.createRow () устанавливает значение ячейки в первой итерации, и когда она заканчивает свою итерацию в цикле j for, список cFilledPositions очищается, и пока он возвращается после перехода к основному циклу, 'cFilledPositions will be empty and the integer k will again be initialized to 1 . This is when createRow (k) `, который равен 1, вызывается снова. Это очистит ранее существующие значения в 1-й строке. Я пытаюсь найти обходной путь для этого и отредактирую свой ответ решением, если мой код работает.

Ниже была работа вокруг. Я проверил, если строка пуста. Функция createRow вызывается только тогда, когда строка пуста. Я добавил комментарии к новому коду.

 for(int i=0;i<noOfCols1;i++)
        {
        	for(int j=1;j<=noOfRows1;j++)
        	{
        		value1 = formatter.formatCellValue(sheet1.getRow(j).getCell(i));
        			for(int m=1;m<=noOfRows2;m++)
        			{
        				value2 = formatter.formatCellValue(sheet2.getRow(m).getCell(i));
        				value1= value1.trim();
        				value2=value2.trim();
        				int value2Position = sheet2.getRow(m).getCell(i).getRowIndex();
        				if(!positions.contains(value2Position))
        				{
        				 if(value1.contentEquals(value2))
        				 {
        					positions.add(value2Position);
        					matched = true;
        				 }
        				 else{
        					 matched = false;
        				 }
        				}
        				if(matched==true)
        				{
        					break;
        				}
        			}
        			if(matched == false)
        			{   
        				int k=1;
                        
        				if(cFilledPositions.isEmpty())
        				{
        					try{
        					isEmpty = checkIfRowIsEmpty(sheet,k,formatter);
        					if(isEmpty)
        					{
        						rowHead = sheet.createRow(k);
        					}
                           rowHead.createCell(i).setCellValue(value1);
        					}
        					catch (Exception e){
        						try{
        							rowHead = sheet.createRow(k);
        							 rowHead.createCell(i).setCellValue(value1);
        						}
        						catch (Exception e1){
        							
        						}
        					}
            				
        				}
        				else
        				{
        					int l = cFilledPositions.size()-1;
        						k = cFilledPositions.get(l)+1;
        						try{
                					isEmpty = checkIfRowIsEmpty(sheet,k,formatter);
                					if(isEmpty)
                					{
                						rowHead =  sheet.createRow(k);
                					}
                				rowHead.createCell(i).setCellValue(value1);
        						}
        						catch (Exception e)
        						{
        							try{
            							rowHead = sheet.createRow(k);
            							 rowHead.createCell(i).setCellValue(value1);
            						}
            						catch (Exception e1){
            							
            						}
        						}
        				}
        				cFilledPositions.add(k);	
             		}
        			matched = false;
        	}
        	cFilledPositions.clear();
        	positions.clear(); 
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...