標題說明了一切——需要隱藏包含我的資料的行和列之外的所有行和列。
我嘗試了幾種選擇:
- 如何使用 Java Apache POI 在 Excel 作業表中隱藏以下未使用的行?
- 在 Excel 作業表中使用 JAVA 永久洗掉空行 Apache POI
- 如何使用 Java Apache POI 在 Excel 作業表中隱藏以下未使用的行?
但這些永遠不會產生預期的效果。我正在使用 apache poi 版本 4.1.1
請參閱以下螢屏截圖,顯示我擁有的 excel 格式與我想要的格式。(由于我是 stackoverflow 的新手,它不允許我直接嵌入圖片。我知道很奇怪。)
我有的
我需要的
uj5u.com熱心網友回復:
標記第一個“外部”列,按住CTRL SHIFT 然后向右箭頭。然后,應突出顯示所有列。右鍵單擊,選擇“隱藏”。
對行重復相同的操作,選擇資料之外的第一行,按住CTRL SHIFT 并按向下箭頭鍵。
祝你好運!^_^
uj5u.com熱心網友回復:
apache poi直到現在,高級類都不提供隱藏未使用的行和列。
隱藏未使用的行是 的作業表格式屬性中的設定Office Open XML,格式為XSSF( *.xlsx)。定義了默認情況下如何處理行。例如默認行高。但也可以設定行的默認高度為零。因此,只有使用過的行,其中包含具有內容或格式的單元格是可見的。由于apache poi沒有設定方法,SheetFormatPr.setZeroHeight我們需要使用底層org.openxmlformats.schemas.spreadsheetml.x2006.main.*類。
在( ) 的二進制BIFF格式中隱藏未使用的行是作業表記錄流中的記錄設定。可以設定選項標志。選項標志 0x0002 表示隱藏未使用的行。要設定使用我們需要訪問. 這只能從.HSSF*.xlsDEFAULTROWHEIGHTapache poiorg.apache.poi.hssf.record.DefaultRowHeightRecordInternalSheet
可以使用 來隱藏列Sheet.setColumnHidden,但只能用于單列。所以要隱藏 100 列,需要呼叫Sheet.setColumnHidden100 次。
Excel還提供從最小列到最大列的列范圍設定。但是Apache poi沒有為此提供高級方法。
使用XSSF( Office Open XML) 我們需要org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols獲取或設定org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol具有適當最小值和最大值的 a 和setHidden(true)。
使用HSSF( BIFF) 我們需要COLINFO從/到作業表的記錄流獲取或設定記錄,該記錄流具有適當的最小值和最大值以及 和setHidden(true)。
以下完整示例顯示了上述代碼示例。它使用ExcelExampleIn.xlsx或ExcelExampleIn.xls作為輸入并將未使用的行設定為隱藏并設定從給定的最小到最大列隱藏的列。
測驗并使用apache poi 4.1.1.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.model.InternalSheet;
import org.apache.poi.hssf.record.DefaultRowHeightRecord;
import org.apache.poi.hssf.record.ColumnInfoRecord;
import org.apache.poi.hssf.record.RecordBase;
import java.util.List;
public class ExcelHideUnusedRowsAndColumns {
static void setUnusedRowsHidden(Sheet sheet) throws Exception {
if (sheet instanceof XSSFSheet) {
// in OOXML set zeroHeight property true for all undefined rows, so only rows having special settings are visible
XSSFSheet xssfSheet = (XSSFSheet)sheet;
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet ctWorksheet = xssfSheet.getCTWorksheet();
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetFormatPr ctSheetFormatPr = ctWorksheet.getSheetFormatPr();
if (ctSheetFormatPr == null) ctSheetFormatPr = ctWorksheet.addNewSheetFormatPr();
ctSheetFormatPr.setZeroHeight(true);
} else if (sheet instanceof HSSFSheet) {
// in BIFF file format set option flag 0x0002 in DEFAULTROWHEIGHT record
HSSFSheet hssfSheet= (HSSFSheet)sheet;
java.lang.reflect.Field _sheet = HSSFSheet.class.getDeclaredField("_sheet");
_sheet.setAccessible(true);
InternalSheet internalSheet = (InternalSheet)_sheet.get(hssfSheet);
java.lang.reflect.Field defaultrowheight = InternalSheet.class.getDeclaredField("defaultrowheight");
defaultrowheight.setAccessible(true);
DefaultRowHeightRecord defaultRowHeightRecord = (DefaultRowHeightRecord)defaultrowheight.get(internalSheet);
defaultRowHeightRecord.setOptionFlags((short)2);
}
}
static void setColumnsHidden(Sheet sheet, int min, int max) throws Exception {
if (sheet instanceof XSSFSheet) {
// respect max column count 16384 (1 to 16384) for OOXML
if (max > 16384) max = 16384;
// in OOXML set cols settings in XML
XSSFSheet xssfSheet = (XSSFSheet)sheet;
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet ctWorksheet = xssfSheet.getCTWorksheet();
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols ctCols = ctWorksheet.getColsArray(0);
boolean colSettingFound = false;
for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol ctCol : ctCols.getColList()) {
if (ctCol.getMin() == min && ctCol.getMax() == max) {
colSettingFound = true;
ctCol.setHidden(true);
}
System.out.println(ctCol);
}
if (!colSettingFound) {
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol ctCol = ctCols.addNewCol();
ctCol.setMin(min);
ctCol.setMax(max);
ctCol.setHidden(true);
System.out.println(ctCol);
}
} else if (sheet instanceof HSSFSheet) {
// in BIFF min and max are 0-based
min = min -1;
max = max -1;
// respect max column count 256 (0 to 255) for BIFF
if (max > 255) max = 255;
// in BIFF file format set hidden property in COLINFO record
HSSFSheet hssfSheet= (HSSFSheet)sheet;
java.lang.reflect.Field _sheet = HSSFSheet.class.getDeclaredField("_sheet");
_sheet.setAccessible(true);
InternalSheet internalSheet = (InternalSheet)_sheet.get(hssfSheet);
java.lang.reflect.Field _records = InternalSheet.class.getDeclaredField("_records");
_records.setAccessible(true);
@SuppressWarnings("unchecked")
List<RecordBase> records = (List<RecordBase>)_records.get(internalSheet);
boolean colInfoFound = false;
for (RecordBase record : records) {
if (record instanceof ColumnInfoRecord) {
ColumnInfoRecord columnInfoRecord = (ColumnInfoRecord)record;
if (columnInfoRecord.getFirstColumn() == min && columnInfoRecord.getLastColumn() == max) {
colInfoFound = true;
columnInfoRecord.setHidden(true);
}
System.out.println(columnInfoRecord);
}
}
if (!colInfoFound) {
ColumnInfoRecord columnInfoRecord = new ColumnInfoRecord();
columnInfoRecord.setFirstColumn(min);
columnInfoRecord.setLastColumn(max);
columnInfoRecord.setHidden(true);
records.add(records.size()-1, columnInfoRecord);
System.out.println(columnInfoRecord);
}
}
}
public static void main(String[] args) throws Exception {
String inFilePath = "./ExcelExampleIn.xlsx"; String outFilePath = "./ExcelExampleOut.xlsx";
//String inFilePath = "./ExcelExampleIn.xls"; String outFilePath = "./ExcelExampleOut.xls";
try (Workbook workbook = WorkbookFactory.create(new FileInputStream(inFilePath));
FileOutputStream out = new FileOutputStream(outFilePath ) ) {
Sheet sheet = workbook.getSheetAt(0);
//set unused rows hidden
setUnusedRowsHidden(sheet);
//set multiple columns hidden, here column 7 (G) to last column 16384 (XFD)
setColumnsHidden(sheet, 7, 16384);
workbook.write(out);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/390958.html
標籤:擅长 apache-poi
