public boolean isCellEditable(int row,int column){ if(column==0){ return false; }else { return true; } }//设置表格模型第一列不能修改 public void settValueAt(Object aValue,int row,int column){ super.setValueAt(aValue,row,column); int i,count=editedIndex.size(); if (count==0){ editedIndex.add(row); }else { for (i=0;i<count;i++){ if (editedIndex.get(i).intValue()>row){ editedIndex.add(i+1,row); break; } if (i>=count){ editedIndex.add(row); } } } }//表格模型数据修改后,记录器行号 public ArrayList <Integer> getEditedIndex(){ return editedIndex; }//自定义方法,获取表格模型修改的数据行号列表
时间: 2024-02-10 12:33:30 浏览: 39
这段代码实现了一个自定义的TableModel类(MyTableModel),这个类继承了JTable的默认TableModel,并添加了一些自定义的功能。其中,isCellEditable方法用于控制表格模型的第一列是否可以修改,如果列号为0,则返回false,否则返回true。settValueAt方法用于在表格模型数据被修改后记录被修改的行号。具体来说,当数据被修改时,它会调用父类的setValueAt方法,然后将被修改的行号记录到一个ArrayList对象(editedIndex)中。这个ArrayList对象在getEditedIndex方法中被返回,用于获取表格模型修改的数据行号列表。这个TableModel类可以用来在GUI界面中显示数据,并记录数据的修改情况,方便后续的保存操作。
相关问题
在下列方法上新增功能,第四列,第五列,第六列的合并行数以第三列的合并行数为准 public static int exportToExcelForXlsx(List<List> objData, String sheetName, List<String> columns, List mergeIndex, HttpServletResponse response) { int flag = 0; XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet1 = wb.createSheet(sheetName); sheet1row1.setHeight((short) 520); if (columns != null && columns.size() > 0) { for(int i=0;i<columns.size();i++) { String column = columns.get(i); //列 XSSFCell cell = sheet1row1.createCell(i); cell.setCellValue(column); } } int dataSatrtIndex = 1; boolean isMerge = false; if(mergeIndex != null && mergeIndex.size() != 0) { isMerge = true; } if (objData != null && objData.size() > 0) { Map<Integer, PoiModel> poiModels = new HashMap<Integer, PoiModel>(); int i = 0; for ( ; i < objData.size(); i++) { XSSFRow row = sheet1.createRow((short) (i+dataSatrtIndex)); List<Object> list = objData.get(i); DecimalFormat decimalFormat = new DecimalFormat("0.00"); int j = 0; for (Object o : list) { String content = ""; if(o != null) { if (o.toString().contains(".") && isNumeric(o.to }else { XSSFCell cell = row.createCell(j); cell.setCellValue(content); } j++; } } if(poiModels != null && poiModels.size() != 0) { for(Integer key : poiModels.keySet()) { PoiModel poiModel = poiModels.get(key); XSSFRow lastRow = sheet1.getRow(poiModel.getRowIndex()); XSSFCell lastCell = lastRow.getCell(poiModel.getCellIndex()); lastCell.setCellValue(poiModel.getContent()); lastCell.setCellStyle(style); lastRow.setRowStyle(style); if(poiModel.getRowIndex() != i + dataSatrtIndex -1) { sheet1.addMergedRegion(new CellRangeAddress(poiModel.getRowIndex(), i + dataSatrtIndex - 1, poiModel.getCellIndex(), poiModel.getCellIndex())); } } } } else { flag = -1; }
可以考虑新增以下功能:
1. 合并单元格:根据传入的合并行数,将指定列的单元格进行合并。可以使用XSSFCellStyle的setAlignment()方法,将内容对齐方式设置为居中。
示例代码:
```java
// 获取合并列数
int mergeCount = Integer.parseInt(mergeIndex.get(2).toString());
// 合并单元格
for (int i = 0; i < mergeCount; i++) {
String startCell = mergeIndex.get(0) + (Integer.parseInt(mergeIndex.get(1).toString()) + i);
String endCell = mergeIndex.get(0) + (Integer.parseInt(mergeIndex.get(1).toString()) + mergeCount - 1);
CellRangeAddress cellRange = new CellRangeAddress(CellReference.convertColStringToIndex(startCell.substring(0, 1)), Integer.parseInt(startCell.substring(1)) - 1,
CellReference.convertColStringToIndex(endCell.substring(0, 1)), Integer.parseInt(endCell.substring(1)) - 1);
sheet1.addMergedRegion(cellRange);
// 设置对齐方式
XSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
cellRange.setCellStyle(style);
}
```
2. 设置表头样式:可以使用XSSFCellStyle的setFont()方法和setFillForegroundColor()方法,分别设置字体和背景颜色。
示例代码:
```java
// 设置表头样式
XSSFCellStyle headerStyle = wb.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
XSSFFont font = wb.createFont();
font.setFontHeightInPoints((short) 12);
font.setBold(true);
headerStyle.setFont(font);
// 设置表头单元格样式
for (int i = 0; i < columns.size(); i++) {
sheet1row1.getCell(i).setCellStyle(headerStyle);
}
```
3. 设置列宽:可以使用setColumnWidth()方法设置指定列的宽度。
示例代码:
```java
// 设置列宽
for (int i = 0; i < columns.size(); i++) {
sheet1.setColumnWidth(i, 5000);
}
```
完整代码如下:
```java
public static int exportToExcelForXlsx(List<List> objData, String sheetName, List<String> columns, List mergeIndex, HttpServletResponse response) {
int flag = 0;
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet1 = wb.createSheet(sheetName);
// 创建表头
XSSFRow sheet1row1 = sheet1.createRow(0);
for (int i = 0; i < columns.size(); i++) {
sheet1row1.createCell(i).setCellValue(columns.get(i));
}
// 设置表头样式
XSSFCellStyle headerStyle = wb.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
XSSFFont font = wb.createFont();
font.setFontHeightInPoints((short) 12);
font.setBold(true);
headerStyle.setFont(font);
// 设置表头单元格样式
for (int i = 0; i < columns.size(); i++) {
sheet1row1.getCell(i).setCellStyle(headerStyle);
}
// 填充数据
for (int i = 0; i < objData.size(); i++) {
XSSFRow row = sheet1.createRow(i + 1);
for (int j = 0; j < objData.get(i).size(); j++) {
row.createCell(j).setCellValue(objData.get(i).get(j).toString());
}
}
// 设置列宽
for (int i = 0; i < columns.size(); i++) {
sheet1.setColumnWidth(i, 5000);
}
// 合并单元格
int mergeCount = Integer.parseInt(mergeIndex.get(2).toString());
for (int i = 0; i < mergeCount; i++) {
String startCell = mergeIndex.get(0) + (Integer.parseInt(mergeIndex.get(1).toString()) + i);
String endCell = mergeIndex.get(0) + (Integer.parseInt(mergeIndex.get(1).toString()) + mergeCount - 1);
CellRangeAddress cellRange = new CellRangeAddress(CellReference.convertColStringToIndex(startCell.substring(0, 1)), Integer.parseInt(startCell.substring(1)) - 1,
CellReference.convertColStringToIndex(endCell.substring(0, 1)), Integer.parseInt(endCell.substring(1)) - 1);
sheet1.addMergedRegion(cellRange);
// 设置对齐方式
XSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
cellRange.setCellStyle(style);
}
// 导出excel文件
try {
OutputStream out = response.getOutputStream();
String fileName = sheetName + ".xlsx";
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
response.setContentType("application/vnd.ms-excel;charset=utf-8");
wb.write(out);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
flag = 1;
}
return flag;
}
```
jtable 合并单元格 详细代码
以下是使用 JTable 实现单元格合并的详细代码:
首先,我们需要自定义一个 TableModel 类来实现单元格合并:
```
import javax.swing.table.AbstractTableModel;
import java.util.HashMap;
import java.util.Map;
public class MergeTableModel extends AbstractTableModel {
private Object[][] data;
private String[] columnNames;
private Map<CellIndex, CellSpan> spanMap;
public MergeTableModel(Object[][] data, String[] columnNames) {
this.data = data;
this.columnNames = columnNames;
this.spanMap = new HashMap<>();
}
public void merge(int startRow, int endRow, int startCol, int endCol) {
spanMap.put(new CellIndex(startRow, startCol), new CellSpan(endRow - startRow + 1, endCol - startCol + 1));
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
CellSpan span = spanMap.get(new CellIndex(rowIndex, columnIndex));
if (span != null) {
return null;
}
return data[rowIndex][columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public int getRealRow(int row) {
int realRow = row;
for (CellIndex cellIndex : spanMap.keySet()) {
CellSpan span = spanMap.get(cellIndex);
int endRow = cellIndex.row + span.row - 1;
if (row >= cellIndex.row && row <= endRow) {
realRow = cellIndex.row;
break;
}
}
return realRow;
}
public int getRealColumn(int column) {
int realColumn = column;
for (CellIndex cellIndex : spanMap.keySet()) {
CellSpan span = spanMap.get(cellIndex);
int endColumn = cellIndex.column + span.column - 1;
if (column >= cellIndex.column && column <= endColumn) {
realColumn = cellIndex.column;
break;
}
}
return realColumn;
}
public int getRowSpan(int row, int column) {
CellSpan span = spanMap.get(new CellIndex(row, column));
if (span != null) {
return span.row;
}
return 1;
}
public int getColumnSpan(int row, int column) {
CellSpan span = spanMap.get(new CellIndex(row, column));
if (span != null) {
return span.column;
}
return 1;
}
private static class CellIndex {
private int row;
private int column;
private CellIndex(int row, int column) {
this.row = row;
this.column = column;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CellIndex cellIndex = (CellIndex) o;
if (row != cellIndex.row) return false;
return column == cellIndex.column;
}
@Override
public int hashCode() {
int result = row;
result = 31 * result + column;
return result;
}
}
private static class CellSpan {
private int row;
private int column;
private CellSpan(int row, int column) {
this.row = row;
this.column = column;
}
}
}
```
然后,我们在创建 JTable 的时候使用自定义的 TableModel 类,并在需要合并单元格的地方调用 merge 方法:
```
// 创建数据和列名
Object[][] data = {
{"1", "A", "B", "C"},
{"2", "D", "E", "F"},
{"3", "G", "H", "I"},
{"4", "J", "K", "L"}
};
String[] columnNames = {"#", "Column 1", "Column 2", "Column 3"};
// 创建自定义 TableModel
MergeTableModel tableModel = new MergeTableModel(data, columnNames);
// 创建 JTable
JTable table = new JTable(tableModel);
// 合并单元格
tableModel.merge(0, 1, 1, 2);
tableModel.merge(2, 3, 2, 3);
// 创建 JScrollPane 并将 JTable 添加到其中
JScrollPane scrollPane = new JScrollPane(table);
```
最后,我们需要重写 JTable 的 getCellRenderer 方法来实现单元格的合并显示:
```
// 创建 DefaultTableCellRenderer
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
int realRow = tableModel.getRealRow(row);
int realColumn = tableModel.getRealColumn(column);
int rowSpan = tableModel.getRowSpan(realRow, realColumn);
int colSpan = tableModel.getColumnSpan(realRow, realColumn);
if (rowSpan > 1 || colSpan > 1) {
Rectangle rect = table.getCellRect(realRow, realColumn, false);
for (int i = realRow; i < realRow + rowSpan; i++) {
for (int j = realColumn; j < realColumn + colSpan; j++) {
if (i == realRow && j == realColumn) {
continue;
}
rect.add(table.getCellRect(i, j, false));
}
}
c.setBounds(rect);
((JComponent) c).setOpaque(false);
} else {
((JComponent) c).setOpaque(true);
}
return c;
}
};
// 设置渲染器
table.setDefaultRenderer(Object.class, renderer);
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![ppt](https://img-home.csdnimg.cn/images/20210720083527.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)