我想有一個類Employess
,從那里我用firstName
,lastName
和創建物件city
。
我想遍歷一個Employees陣列,并為每個創建的物件提取firstName
,lastName
并將city
其寫入Excel檔案。
我的代碼塊在第二個 for 塊中,并帶有以下錯誤訊息:
執行緒“主”java.lang.ClassCastException 中的例外:類 http.Employees 不能轉換為類 [Ljava.lang.Object; (http.Employees 在加載器“app”的未命名模塊中;[Ljava.lang.Object;在加載器“bootstrap”的模塊 java.base 中)位于 http.App.main(App.java:64)。
我是 Java 新手,我認為我使用 HashMap 的方式是錯誤的,但我不知道如何以正確的方式處理它。
任何幫助將非常感激。謝謝你。
下面的代碼:
class Employees {
String firstName;
String lastName;
String city;
public Employees(String firstName, String lastName, String city) {
this.firstName = firstName;
this.lastName = lastName;
this.city = city;
}
}
public class App {
public static void main(String[] args) throws Exception {
String excelPath = "C:/Work/01_TSM/java/test.xlsx";
FileInputStream inputStream = new FileInputStream(new File(excelPath));
// create workbook object
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
// create spreadsheet object
XSSFSheet spreadsheet = workbook.getSheetAt(1);
// create row object
XSSFRow row;
// This data needs to be written in (Object[])
HashMap<Integer, Object> employeeData = new HashMap<Integer, Object>();
Employees employee1 = new Employees("John", "Smith", "CT");
Employees employee2 = new Employees("Jane", "Doe", "O");
Employees[] employees = { employee1, employee2 };
// Insert data
for (int i = 0; i < employees.length; i ) {
employeeData.put(i, employees[i]);
}
;
Set<Integer> keyid = employeeData.keySet();
int rowid = 1;
// writing the data into the sheets
for (Integer key : keyid) {
row = spreadsheet.createRow(rowid );
// here the code breaks
Object[] objectArr = (Object[]) employeeData.get(key);
int cellid = 0;
for (Object obj : objectArr) {
Cell cell = row.createCell(cellid );
cell.setCellValue((String) obj);
}
}
// writing the workbook into the file
FileOutputStream out = new FileOutputStream(new File("C:/Work/01_TSM/java/test.xlsx"));
workbook.write(out);
out.close();
}
}
uj5u.com熱心網友回復:
這是您可以使用的完整示例。將輸出檔案的完整路徑作為引數傳遞給程式:
package xlsconv;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFCell;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;
import java.io.OutputStream;
import java.io.BufferedOutputStream;
public class Beans2Sheet {
public static void main(String[] args) {
try {
Beans2Sheet b2s = new Beans2Sheet();
Employee[] emps = new Employee[] {
new Employee("John", "Doe", "Kansas City"),
new Employee("John", "Doe", "New York City")
};
b2s.beans2Sheet(emps, Paths.get(args[0]));
} catch (Exception e) {
e.printStackTrace();
}
}
public void beans2Sheet(Employee[] employees, Path outputPath) throws IOException {
XSSFWorkbook workBook = new XSSFWorkbook();
XSSFSheet sheet = workBook.createSheet();
for (int rowNum = 0; rowNum < employees.length; rowNum ) {
XSSFRow row = sheet.createRow(rowNum);
String[] fields = employees[rowNum].toFields();
for (int i = 0; i < fields.length; i ) {
XSSFCell cell = row.createCell(i);
cell.setCellValue(fields[i]);
}
}
try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(outputPath))) {
workBook.write(out);
}
}
}
這在類中使用了一個方便的方法Employee
,將類欄位作為陣列回傳:
public String[] toFields() {
return new String[] { firstName, lastName, city };
}
uj5u.com熱心網友回復:
您的代碼中的問題在于您Employees
從HashMap
. 實際上,您employeeData
的定義是HashMap
帶有Integer
鍵和Object
值的(即您的Employees
)。當您執行 amap.get(key)
時,該方法回傳一個Object
,特別是一個Employees
,而不是一個Object[]
; 因此ClassCastException
.
此外,HashMap
是一個泛型類。這意味著表示鍵和值的資料型別的型別引數 K 和 V 可以使用適當的型別引數指定。在您的情況下,它更適合Employees
用作您的值的資料型別。事實上,Object
它太通用了,它迫使您求助于轉換并失去了泛型的眾多好處之一。
https://docs.oracle.com/javase/tutorial/java/generics/why.html
HashMap
最后,您撰寫的代碼似乎不需要 a 。實際上,您可以通過使用Employees
. 在這里,我將在您的類中留下依賴于 getter 方法的兩個實作Employees
:
HashMap 實作
String pathFileExcel = "C:/Work/01_TSM/java/test.xlsx";
//Creating a workbook
XSSFWorkbook workbook = new XSSFWorkbook();
//Making sure a spreadSheet exsists before retrieving it
if (workbook.getNumberOfSheets() == 0) {
workbook.createSheet();
}
XSSFSheet spreadsheet = workbook.getSheetAt(0);
//Creating a map
Map<Integer, Employees> employeeMap = new HashMap<>(Map.of(
0, new Employees("John", "Smith", "CT"),
1, new Employees("Jane", "Doe", "O")
));
int rowNum = 0;
//writing the data into the sheets
for (Integer key : employeeMap.keySet()) {
XSSFRow row = spreadsheet.createRow(rowNum );
Employees emp = employeeMap.get(key);
Cell cellFirstName = row.createCell(0);
cellFirstName.setCellValue((emp.getFirstName()));
Cell cellLastName = row.createCell(1);
cellLastName.setCellValue((emp.getLastName()));
Cell cellCity = row.createCell(2);
cellCity.setCellValue((emp.getCity()));
}
//the try-with automatically closes the connection once exited the try block
try (FileOutputStream out = new FileOutputStream(pathFileExcel);) {
workbook.write(out);
}
員工實施陣列
String pathFileExcel = "C:/Work/01_TSM/java/test.xlsx";
//Creating a workbook
XSSFWorkbook workbook = new XSSFWorkbook();
//Making sure a spreadSheet exsists before retrieving it
if (workbook.getNumberOfSheets() == 0) {
workbook.createSheet();
}
XSSFSheet spreadsheet = workbook.getSheetAt(0);
//Creating an array
Employees[] vetEmp = new Employees[]{
new Employees("John", "Smith", "CT"),
new Employees("Jane", "Doe", "O")
};
int rowNum = 0;
//writing the data into the sheets
for (Employees emp : vetEmp) {
XSSFRow row = spreadsheet.createRow(rowNum );
Cell cellFirstName = row.createCell(0);
cellFirstName.setCellValue((emp.getFirstName()));
Cell cellLastName = row.createCell(1);
cellLastName.setCellValue((emp.getLastName()));
Cell cellCity = row.createCell(2);
cellCity.setCellValue((emp.getCity()));
}
//the try-with automatically closes the connection once exited the try block
try (FileOutputStream out = new FileOutputStream(pathFileExcel);) {
workbook.write(out);
}
uj5u.com熱心網友回復:
該值不是物件陣列,而是“Employees”型別的物件,因此您不能將其轉換為陣列:
Object[] objectArr = (Object[]) employeeData.get(key);
int cellid = 0;
for (Object obj : objectArr) {
Cell cell = row.createCell(cellid );
cell.setCellValue((String) obj);
}
編輯:我認為這可能是您想要實作的目標:
HashMap<Integer, Object> employeeData = new HashMap<Integer, Object>();
Employees employee1 = new Employees("John", "Smith", "CT");
Employees employee2 = new Employees("Jane", "Doe", "O");
Employees[] employees = { employee1, employee2 };
for (int i = 0; i < employees.length; i ) {
employeeData.put(i, employees[i]);
}
Set<Integer> keyid = employeeData.keySet();
int rowid = 1;
for (Integer key : keyid) {
row = spreadsheet.createRow(rowid );
// here the code breaks
Employees employee = (Employees)employeeData.get(key);
for (int cellid = 0; cellid < 3; cellid )
{
Cell cell = row.createCell(cellid ):
if (cellid == 0)
{
cell.setCellValue(employee.firstName);
}
else if(cellid == 1)
{
cell.setCellValue(employee.lastName);
}
else if(cellid == 2)
{
cell.setCellValue(employee.city);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489356.html
標籤:爪哇 数组 擅长 哈希图 apache-poi
下一篇:檢測和計算間隙VBA