上一篇
java怎么输出excel后居右显示
- 后端开发
- 2025-09-01
- 7
Java中,使用Apache POI库生成Excel文件后,可通过设置单元格的水平和垂直对
Java中输出Excel文件并使内容居右显示,通常需要借助第三方库,如Apache POI,Apache POI是一个强大的Java库,用于读写Microsoft Office格式的文件,包括Excel,以下是详细的步骤和代码示例,展示如何使用Apache POI创建一个Excel文件,并使单元格内容居右显示。
添加Apache POI依赖
确保你的项目中包含了Apache POI的依赖,如果你使用的是Maven,可以在pom.xml
中添加以下依赖:
<dependencies> <!-Apache POI Core --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <!-Apache POI for XLSX (Excel 2007+) --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> </dependencies>
如果你不是使用Maven,可以手动下载Apache POI的JAR文件并添加到项目的类路径中。
创建Excel文件并设置单元格内容居右
以下是一个完整的Java示例代码,展示如何创建一个Excel文件,并在其中写入内容,同时将单元格内容设置为居右显示。
import org.apache.poi.ss.usermodel.; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelRightAlignExample { public static void main(String[] args) { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("示例表格"); // 创建单元格样式,设置水平对齐为居右 CellStyle rightAlignStyle = workbook.createCellStyle(); rightAlignStyle.setAlignment(HorizontalAlignment.RIGHT); // 创建字体(可选) Font font = workbook.createFont(); font.setBold(true); font.setFontHeightInPoints((short) 12); rightAlignStyle.setFont(font); // 创建边框(可选) rightAlignStyle.setBorderBottom(BorderStyle.THIN); rightAlignStyle.setBorderTop(BorderStyle.THIN); rightAlignStyle.setBorderLeft(BorderStyle.THIN); rightAlignStyle.setBorderRight(BorderStyle.THIN); // 创建标题行 Row headerRow = sheet.createRow(0); String[] headers = {"编号", "姓名", "年龄", "部门"}; for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(rightAlignStyle); // 设置列宽,自动根据内容调整 sheet.autoSizeColumn(i); } // 模拟数据 Object[][] data = { {1, "张三", 28, "研发部"}, {2, "李四", 34, "市场部"}, {3, "王五", 23, "人事部"}, {4, "赵六", 30, "财务部"} }; // 填充数据行 for (int rowIndex = 0; rowIndex < data.length; rowIndex++) { Row row = sheet.createRow(rowIndex + 1); // 从第二行开始 Object[] rowData = data[rowIndex]; for (int colIndex = 0; colIndex < rowData.length; colIndex++) { Cell cell = row.createCell(colIndex); // 根据数据类型设置单元格值 if (rowData[colIndex] instanceof String) { cell.setCellValue((String) rowData[colIndex]); } else if (rowData[colIndex] instanceof Integer) { cell.setCellValue((Integer) rowData[colIndex]); } else if (rowData[colIndex] instanceof Double) { cell.setCellValue((Double) rowData[colIndex]); } else { cell.setCellValue(rowData[colIndex].toString()); } // 应用居右样式 cell.setCellStyle(rightAlignStyle); } } // 设置整个工作表的默认样式为居右(可选) // 如果希望所有未单独设置样式的单元格也居右,可以取消注释以下代码 / for (Row row : sheet) { for (Cell cell : row) { CellStyle style = cell.getCellStyle(); style.cloneStyleFrom(rightAlignStyle); } } / // 写入到文件 try (FileOutputStream fileOut = new FileOutputStream("示例.xlsx")) { workbook.write(fileOut); System.out.println("Excel文件已成功创建!"); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭工作簿以释放资源 try { workbook.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
代码详解
1 创建工作簿和工作表
Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("示例表格");
Workbook
:表示一个Excel文件。XSSFWorkbook
用于处理.xlsx
格式的文件,如果需要处理旧的.xls
格式,可以使用HSSFWorkbook
。Sheet
:表示Excel中的一个工作表。
2 创建单元格样式并设置居右对齐
CellStyle rightAlignStyle = workbook.createCellStyle(); rightAlignStyle.setAlignment(HorizontalAlignment.RIGHT);
CellStyle
:定义单元格的样式,如字体、颜色、对齐方式等。setAlignment(HorizontalAlignment.RIGHT)
:将单元格内容的水平对齐方式设置为居右。
3 可选:设置字体和边框
Font font = workbook.createFont(); font.setBold(true); font.setFontHeightInPoints((short) 12); rightAlignStyle.setFont(font); rightAlignStyle.setBorderBottom(BorderStyle.THIN); rightAlignStyle.setBorderTop(BorderStyle.THIN); rightAlignStyle.setBorderLeft(BorderStyle.THIN); rightAlignStyle.setBorderRight(BorderStyle.THIN);
Font
:定义字体的样式,如加粗、字体大小等。setBorder...
:设置单元格的边框样式,这里设置为细边框。
4 创建标题行
Row headerRow = sheet.createRow(0); String[] headers = {"编号", "姓名", "年龄", "部门"}; for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(rightAlignStyle); sheet.autoSizeColumn(i); }
createRow(0)
:在工作表中创建第一行(索引从0开始)。createCell(i)
:在行中创建第i
个单元格。setCellValue
:设置单元格的值。setCellStyle
:应用之前定义的居右样式。autoSizeColumn(i)
自动调整第i
列的宽度。
5 填充数据行
Object[][] data = { {1, "张三", 28, "研发部"}, {2, "李四", 34, "市场部"}, {3, "王五", 23, "人事部"}, {4, "赵六", 30, "财务部"} }; for (int rowIndex = 0; rowIndex < data.length; rowIndex++) { Row row = sheet.createRow(rowIndex + 1); // 从第二行开始 Object[] rowData = data[rowIndex]; for (int colIndex = 0; colIndex < rowData.length; colIndex++) { Cell cell = row.createCell(colIndex); // 根据数据类型设置单元格值 if (rowData[colIndex] instanceof String) { cell.setCellValue((String) rowData[colIndex]); } else if (rowData[colIndex] instanceof Integer) { cell.setCellValue((Integer) rowData[colIndex]); } else if (rowData[colIndex] instanceof Double) { cell.setCellValue((Double) rowData[colIndex]); } else { cell.setCellValue(rowData[colIndex].toString()); } // 应用居右样式 cell.setCellStyle(rightAlignStyle); } }
- 双重数组
data
存储要写入Excel的数据。 - 外层循环遍历每一行数据,内层循环遍历每一列数据。
- 根据数据类型调用相应的
setCellValue
方法。 - 为每个单元格应用居右样式。
6 写入文件并关闭工作簿
try (FileOutputStream fileOut = new FileOutputStream("示例.xlsx")) { workbook.write(fileOut); System.out.println("Excel文件已成功创建!"); } catch (IOException e) { e.printStackTrace(); } finally { try { workbook.close(); } catch (IOException ex) { ex.printStackTrace(); } }
- 使用
FileOutputStream
将工作簿写入到指定的文件路径。 workbook.write(fileOut)
:将工作簿内容写入文件。- 关闭工作簿以释放资源。
运行结果
运行上述代码后,会在项目根目录下生成一个名为示例.xlsx
的Excel文件,打开该文件,可以看到:
- 第一行为标题行,内容居右显示。
- 下面的数据行内容也均为居右显示。
- 可选的字体和边框样式也会应用到相应的单元格中。
相关问答FAQs
问题1:如何在现有Excel文件中追加内容并保持居右显示?
解答:
要在现有Excel文件中追加内容,可以使用FileInputStream
读取文件,然后进行修改,以下是一个示例:
import org.apache.poi.ss.usermodel.; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.; public class AppendToExcelExample { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("示例.xlsx"); Workbook workbook = new XSSFWorkbook(fis)) { Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表 int lastRowNum = sheet.getLastRowNum(); // 获取最后一行的行号 // 创建新行 Row newRow = sheet.createRow(lastRowNum + 1); Object[] newData = {5, "孙七", 26, "销售部"}; // 创建或获取居右样式 CellStyle rightAlignStyle = workbook.createCellStyle(); rightAlignStyle.setAlignment(HorizontalAlignment.RIGHT); for (int colIndex = 0; colIndex < newData.length; colIndex++) { Cell cell = newRow.createCell(colIndex); if (newData[colIndex] instanceof String) { cell.setCellValue((String) newData[colIndex]); } else if (newData[colIndex] instanceof Integer) { cell.setCellValue((Integer) newData[colIndex]); } else if (newData[colIndex] instanceof Double) { cell.setCellValue((Double) newData[colIndex]); } else { cell.setCellValue(newData[colIndex].toString()); } cell.setCellStyle(rightAlignStyle); } // 写入到文件 try (FileOutputStream fileOut = new FileOutputStream("示例.xlsx")) { workbook.write(fileOut); System.out.println("新数据已成功追加到Excel文件!"); } } catch (IOException e) { e.printStackTrace(); } } }
说明:
- 使用
FileInputStream
读取现有的Excel文件。 - 获取工作表并确定当前的最后一行。
- 创建新行并填充数据,应用居右样式。
- 使用
FileOutputStream
将修改后的工作簿写回到同一个文件。
问题2:如何仅为特定列设置居右显示,而其他列保持默认对齐?
解答:
如果只想为特定列设置居右显示,可以为这些列创建单独的样式,并在填充数据时仅应用到这些列,以下是一个示例:
import org.apache.poi.ss.usermodel.; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class PartialRightAlignExample { public static void main(String[] args) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("部分居右"); // 创建标题行样式(默认左对齐) CellStyle headerStyle = workbook.createCellStyle(); headerStyle.setAlignment(HorizontalAlignment.CENTER); // 标题居中 Font headerFont = workbook.createFont(); headerFont.setBold(true); headerStyle.setFont(headerFont); // 创建特定列的居右样式(例如第2列和第4列) CellStyle rightAlignStyle = workbook.createCellStyle(); rightAlignStyle.setAlignment(HorizontalAlignment.RIGHT); Font rightAlignFont = workbook.createFont(); rightAlignFont.setItalic(true); rightAlignStyle.setFont(rightAlignFont); // 创建标题行 Row headerRow = sheet.createRow(0); String[] headers = {"编号", "姓名", "年龄", "部门"}; for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(headerStyle); sheet.autoSizeColumn(i); } // 模拟数据 Object[][] data = { {1, "张三", 28, "研发部"}, {2, "李四", 34, "市场部"}, {3, "王五", 23, "人事部"}, {4, "赵六", 30, "财务部"} }; // 填充数据行 for (int rowIndex = 0; rowIndex < data.length; rowIndex++) { Row row = sheet.createRow(rowIndex + 1); Object[] rowData = data[rowIndex]; for (int colIndex = 0; colIndex < rowData.length; colIndex++) { Cell cell = row.createCell(colIndex); if (rowData[colIndex] instanceof String) { cell.setCellValue((String) rowData[colIndex]); } else if (rowData[colIndex] instanceof Integer) { cell.setCellValue((Integer) rowData[colIndex]); } else if (rowData[colIndex] instanceof Double) { cell.setCellValue((Double) rowData[colIndex]); } else { cell.setCellValue(rowData[colIndex].toString()); } // 仅为第1列(姓名)和第3列(部门)设置居右样式 if (colIndex == 1 || colIndex == 3) { cell.setCellStyle(rightAlignStyle); } else { cell.setCellStyle(headerStyle); // 其他列使用默认样式或另外定义的样式 } } } // 写入到文件 try (FileOutputStream fileOut = new FileOutputStream("部分居右示例.xlsx")) { workbook.write(fileOut); System.out.println("部分居右的Excel文件已成功创建!"); } catch (IOException e) { e.printStackTrace(); } finally { try { workbook.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
说明:
- 创建不同的样式:行和特定列创建不同的
CellStyle
行使用居中对齐,特定列(如第2列和第4列)使用居右对齐。 - 应用样式:在填充数据时,根据列索引判断是否应用特定的居右样式,其他列可以使用默认样式或另外定义的样式。