Вы должны создать один лист для каждого уникального имени, которое у вас есть в списке массивов ...
Следующий код переставляет введенные вами записи в Map<String, List<String>>
, чтобы уникальное имя телефона использовалось в качестве ключа ивсе цены (уникальные или нет, ваше решение) в списке в качестве значения.Взгляните на комментарии к коду:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Main {
public static void main(String[] args) {
List<String[]> data1 = new ArrayList<String[]>();
data1.add(new String[] { "Apple iPhone 8 Plus (Space Grey, 64 GB)", "56000" });
data1.add(new String[] { "Apple iPhone 6 (Grey, 128 GB)", "47000" });
data1.add(new String[] { "Apple iPhone XS (Space Grey, 512 GB)", "28000" });
data1.add(new String[] { "Apple iPhone XS (Space Grey, 512 GB)", "29000" });
data1.add(new String[] { "Apple iPhone 7 Plus (Gold, 128 GB)", "19000" });
data1.add(new String[] { "Apple iPhone 7 Plus (Gold, 128 GB)", "18000" });
Map<String, List<String>> pricesPerPhoneName = new HashMap<String, List<String>>();
/*
* rearrange the given data in order to have unique names as keys and then use
* those for sheet creation
*/
data1.forEach(arr -> {
String phoneName = arr[0];
String price = arr[1];
// check if the key is present in the map
if (pricesPerPhoneName.containsKey(phoneName)) {
/*
* add another price to the list of prices for the current key, check if the
* price is already contained and do nothing if yes...
*/
List<String> prices = pricesPerPhoneName.get(phoneName);
if (!prices.contains(price)) {
prices.add(price);
}
} else {
// put key and a list with the (one and only so far) price
List<String> prices = new ArrayList<String>();
prices.add(price);
pricesPerPhoneName.put(phoneName, prices);
}
});
/*
* Now, you have all the prices stored as values of each key, which is a unique
* phone name. The remaining code handles the creation of elements of the workbook
*/
XSSFWorkbook workbook = new XSSFWorkbook();
// provide a full path to the workbook
Path workbookPath = Paths.get("C:\\iphones.xlsx"); // CHANGE TO YOUR PATH
// creat a sheet for each phone name and write the data into it
pricesPerPhoneName.forEach((name, prices) -> {
/*
* ########################################################################
* ### please note that names for sheets in excel have a limited length ###
* ### that's why the common prefix gets replaced by nothing here ###
* ########################################################################
*/
XSSFSheet sheet = workbook.createSheet(name.replace("Apple iPhone", ""));
// write one row for each price
for (int i = 0; i < prices.size(); i++) {
XSSFRow row = sheet.createRow(i);
// write the phone name in column A and the price in column B
XSSFCell phoneNameCell = row.createCell(0);
XSSFCell phonePriceCell = row.createCell(1);
phoneNameCell.setCellValue(name);
phonePriceCell.setCellValue(prices.get(i));
}
// make the columns fit their content
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
});
// write the workbook via FileOutputStream
try (FileOutputStream fos = new FileOutputStream(workbookPath.toAbsolutePath().toString())) {
// write the workbook using the FileOutputStream
workbook.write(fos);
// force the FileOutputStream to write everything until it is empty
fos.flush();
// close the FileOutputStream
fos.close();
// close the workbook.
workbook.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Существуют возможности форматирования ячеек, например, указание Excel использовать некоторое денежное форматирование для ценовых ячеек, но это зависит от вас ... и в основном другоевопрос; -)