Мой код записывает данные в Excel, но перезаписывает те же строки и столбцы. Я не хочу перезаписывать строку с заголовками столбцов и строки после них, если в них есть данные.
Шаги 1 введите заголовок столбца 2 введите данные в строках / столбцах 3 если заголовок столбца есть, заголовок столбца не записывать 4, если строка / столбцы заполнены, перейти к следующему 5 повторений 1-4
Мой код ниже. Любая помощь будет оценена по достоинству.
//Create blank workbook
XSSFWorkbook workbook = new XSSFWorkbook();
//Create a blank sheet
XSSFSheet spreadsheet = workbook.createSheet( " Employee Info ");
//Create row object
XSSFRow row;
//This data needs to be written (Object[])
Map < String, Object[] > clientinfo = new TreeMap < String, Object[] >();
clientinfo.put( "1", new Object[] {
"PayRoll Status", "Week #", "Pay Date","End Date" });
clientinfo.put( "2", new Object[] {
CycleStatus, WeekID, DateId, EndDateId });
//Iterate over data and write to sheet
Set < String > keyid = clientinfo.keySet();
int rowid = 0;
for (String key : keyid) {
row = spreadsheet.createRow(rowid++);
Object [] objectArr = clientinfo.get(key);
int cellid = 0;
for (Object obj : objectArr){
Cell cell = row.createCell(cellid++);
cell.setCellValue((String)obj);
}
}
//Write the workbook in file system
FileOutputStream out = new FileOutputStream(
new File("C:/PayrollSync/Pre-Payroll.xlsx"));
workbook.write(out);
out.close();
System.out.println("Prepayroll.xlsx written successfully");
Это решение, которое я придумал, однако он записывает количество строк, есть ли способ его снять
String excelFilePath = "C://PayrollSync//Pre-Payroll.xlsx";
FileInputStream inputStream = new FileInputStream(new File(excelFilePath));
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);
//CycleStatus, WeekID, DateId, EndDateId
Object[][] bookData = {
{CycleStatus,WeekID,DateId,EndDateId},
};
int rowCount = sheet.getLastRowNum();
for (Object[] aBook : bookData) {
Row row = sheet.createRow(++rowCount);
int columnCount = 0;
Cell cell = row.createCell(columnCount);
cell.setCellValue(rowCount);
for (Object field : aBook) {
cell = row.createCell(++columnCount);
if (field instanceof String) {
cell.setCellValue((String) field);
} else if (field instanceof Integer) {
cell.setCellValue((Integer) field);
}
}
}
FileOutputStream outputStream = new FileOutputStream("C://PayrollSync//Pre-Payroll.xlsx");
workbook.write(outputStream);
inputStream.close();
outputStream.close();




Я сделаю это так:
import com.google.common.collect.Lists;
import no.tollpost.web.termodash.rest.report.excel.model.ExcelReportDTO;
import no.tollpost.web.termodash.rest.report.excel.model.RowDTO;
import org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
public final class ExcelGenerator {
private ExcelGenerator() {
}
public static void getExcelVersion(final OutputStream outputStream) {
try {
final Workbook book = new XSSFWorkbook();
generateReport(book);
book.write(outputStream);
} catch (final IOException | OpenXML4JRuntimeException e) {
//log.warn("Failed to build excel report", e);
}
}
private static void generateReport(final Workbook book) {
final Sheet sheet = book.createSheet("Sheet_name);
final List<String> columnNames = getColumnNames();
final List<RowDTO> rows = getRows(getYourData()); // get your data as list of your DTOs
generateTableHeader(sheet, book, columnNames);
generateTableRows(sheet, rows);
IntStream.range(0, columnNames.size()).forEach(sheet::autoSizeColumn);
}
private List<YourDTO> getYourData() {
return // Your data as List (each element will be row in the excel sheet)
}
private static List<String> getColumnNames() {
return Lists.newArrayList("column_name_1", "column_name_2", "column_name_3");
}
private static List<RowDTO> getRows(final List<YourDTO> data) {
final List<RowDTO> rows = new ArrayList<>();
IntStream.range(0, data.size()).forEach(i -> {
final List<String> cellsMapper = new ArrayList<>();
cellsMapper.add(data.get(i).getSomeProperty());
cellsMapper.add(data.get(i).getOtherProperty());
cellsMapper.add(data.get(i).getThirdProperty());
cellsMapper.add(data.get(i).getFourthProperty());
rows.add(new RowDTO(cellsMapper));
});
// rows.sort(Comparator.comparing(row -> row.getData().get(3)));
return rows;
}
private static void generateTableHeader(final Sheet sheet, final Workbook workbook, final List<String> cellTitles) {
final Row tabellHeader = sheet.createRow(0);
IntStream.range(0, cellTitles.size()).forEach(cellNummer -> {
final Cell cell = tabellHeader.createCell(cellNummer);
cell.setCellValue(cellTitles.get(cellNummer));
setHeaderCellStyle(cell, workbook, cellTitles.get(cellNummer));
});
}
private static void setHeaderCellStyle(final Cell celle, final Workbook workbook, final String celleTittel) {
if (!celleTittel.isEmpty()) {
celle.setCellStyle(getHeaderCellStyle(workbook));
}
}
private static CellStyle getHeaderCellStyle(final Workbook workbook) {
final CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
final Font font = workbook.createFont();
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
style.setFont(font);
return style;
}
private static void generateTableRows(final Sheet sheet, final List<RowDTO> rows) {
IntStream.range(0, rows.size()).forEach(rowNUmber -> {
final Row row = sheet.createRow(rowNUmber + 1);
IntStream.range(0, rows.get(rowNUmber).getData().size())
.forEach(cellNumber -> setCellValue(cellNumber, rowNUmber, row, rows));
});
}
private static void setCellValue(final int cellNumber, final int rowNumber, final Row row, final List<RowDTO> rows) {
final Cell cell = row.createCell(cellNumber);
cell.setCellValue(rows.get(rowNumber).getData().get(cellNumber));
cell.setCellType(Cell.CELL_TYPE_STRING);
}
}
final class RowDTO {
private final List<String> data;
public RowDTO(final List<String> data) {
this.data = data;
}
public List<String> getData() {
return data;
}
}
Также это кажется таким сложным, есть ли более простой способ или кодирование?
код, который я поместил выше, уже находится в цикле for внутри eclipse, мне просто нужно записать его в документ Excel, и каждый раз, когда он зацикливается, значения CycleStatus, WeekID, DateId и EndDateId будут разными, если вы можете помочь мне реализовать это решение. будет оценено
Если код, который вы указали выше, уже находится в цикле for, это означает, что вы создаете новую книгу и лист каждый раз, когда выполняете итерацию, т.е. вы получаете несколько файлов Excel только с одной строкой в каждом. Это то, что вы хотите получить?
о нет, я просто хотел многократно вводить переменную, которая содержит текст строки, в каждую строку, а затем, когда она циклически повторяется, она переходит к следующей строке, а затем снова к следующей строке
Единственная проблема в том, что он записывает номер в первый столбец, и я не хочу этого
Приведенный выше код будет держать файл открытым до завершения цикла.
Кажется, что вы повторно используете только ячейку, которую создали в первом цикле. Необходимо создавать новую ячейку для каждого нового фрагмента данных. (Я имею в виду в вашем новом фрагменте кода).
Вы можете дать мне наглядный пример того, что мне нужно сделать
Вот почему я разместил свой код в первую очередь. Если вы не хотите использовать RowDTO, вы можете заменить его на List <List <String>>, где внутренний список - это «строка», а внешний список - это список «строк». Поэтому необходимо только заполнить этот List <List <String>> своими данными.
Позвольте нам продолжить обсуждение в чате.
Проблема с вашим кодом в том, что я не знаю, как связать его с моим классом. код, который я изначально опубликовал выше, находится в одном классе, и у вас есть один класс со многими методами.
t рабочий обряд сейчас я не могу ответить или посмотреть, что вы наберете, вернется к вам позже. файервол блокирует чат.
Спасибо, я попробую это .. Однако у меня уже есть это в классе, можно ли его отформатировать, чтобы не писать в отдельных методах?