我目前正在开发一个项目,要求我将一些大量的输出写入excel电子表格,所以我决定使用Apache POI加快这个过程。但是,我发现过去10行的任何内容都会导致新行被放置在开头。即在第9行之后,第10行将转到电子表格的顶部并将其他所有内容向下推。即使使用TutorialsPoint中的示例文件也会出现这种情况,我将在下面进行介绍。
import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Writesheet
{
public static void main(String[] args) throws Exception
{
//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[] > empinfo =
new TreeMap < String, Object[] >();
empinfo.put( "1", new Object[] {
"EMP ID", "EMP NAME", "DESIGNATION" });
empinfo.put( "2", new Object[] {
"tp01", "Gopal", "Technical Manager" });
empinfo.put( "3", new Object[] {
"tp02", "Manisha", "Proof Reader" });
empinfo.put( "4", new Object[] {
"tp03", "Masthan", "Technical Writer" });
empinfo.put( "5", new Object[] {
"tp04", "Satish", "Technical Writer" });
empinfo.put( "6", new Object[] {
"tp05", "Krishna", "Technical Writer" });
//Iterate over data and write to sheet
Set < String > keyid = empinfo.keySet();
int rowid = 0;
for (String key : keyid)
{
row = spreadsheet.createRow(rowid++);
Object [] objectArr = empinfo.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("Writesheet.xlsx"));
workbook.write(out);
out.close();
System.out.println(
"Writesheet.xlsx written successfully" );
}
}
以上是我提到的示例代码。如果您添加更多行(总数超过10的位置),电子表格将会出现故障。或者你可以使用for循环。
for(int i = 6; i < 20; i++){
String num = Integer.toString(i);
empinfo.put(num, new Object[] {"test", num});
}
原谅我,我绝不擅长编程艺术。如果有人可以提供帮助,我将非常感激!
答案 0 :(得分:2)
问题是你使用带有字符串的TreeMap作为键。因此,一旦将键“10”添加到树形图中,顺序就会不同(可能是1,10,2,3,4 ......)。如果您更改树图以使用整数作为键,它将保持您期望的顺序。
有关字符串排序的更多信息:因为您的TreeMap是在没有比较器的情况下初始化的,所以它按照“自然”排序来命令它的键(请参阅https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html)。字符串的“自然”排序并不是普通人所期望的(见Java String Number Comparator)。