org.ttzero.excel.reader.RowBlock Maven / Gradle / Ivy
/*
* Copyright (c) 2019-2020, [email protected] All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ttzero.excel.reader;
import org.ttzero.excel.entity.e3.DBCell;
import org.ttzero.excel.entity.style.Styles;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.function.Supplier;
import static org.ttzero.excel.manager.Const.ROW_BLOCK_SIZE;
/**
* All cells in the Cell Table are divided into blocks
* of 32 consecutive rows, called Row Blocks.
* The first Row Block starts with the first used row in that sheet.
* Inside each Row Block there will occur ROW records describing
* the properties of the rows, and cell records with all
* the cell contents in this Row Block
*
* @author guanquan.wang at 2019-03-06 18:43
*/
public class RowBlock implements Iterator {
BIFF8Row[] rows;
public DBCell dbCell;
public int nm;
private int i;
AllInOneCell bCell;
// index
private final Map index;
/**
* Shared 32 rows
*/
private RowBlock() {
this.rows = new BIFF8Row[ROW_BLOCK_SIZE];
this.dbCell = new DBCell();
dbCell.firstCellOffsets = new short[ROW_BLOCK_SIZE];
bCell = new AllInOneCell();
index = new HashMap<>(ROW_BLOCK_SIZE << 1);
}
public static RowBlock create(Supplier rowSupplier) {
RowBlock rb = share();
for (int i = 0; i < rb.rows.length; i++) {
rb.rows[i] = rowSupplier.get();
}
return rb;
}
public static RowBlock share() {
RowBlock rb = RowBlockHandler.handler;
rb.nm = rb.i = 0;
return rb;
}
private static class RowBlockHandler {
private static final RowBlock handler = new RowBlock();
}
void resetIndex() {
index.clear();
for (int j = 0; j < nm; j++) {
BIFF8Row row = rows[j];
index.put(row.index, row);
}
}
BIFF8Row getByRow(int row) {
return index.get(row);
}
// -- PUBLIC-
public void setGlobalEntry(SharedStrings sst, Styles styles) {
for (int i = 0; i < ROW_BLOCK_SIZE; i++) {
rows[i].sst = sst;
rows[i].styles = styles;
}
}
public void setHeaderRow(HeaderRow header) {
for (int i = 0; i < ROW_BLOCK_SIZE; i++) {
rows[i].setHr(header);
}
}
@Override
public BIFF8Row next() {
return rows[i++];
}
@Override
public boolean hasNext() {
return i < nm;
}
public BIFF8Row firstRow() {
return rows[0];
}
public BIFF8Row lastRow() {
return rows[nm - 1];
}
public int size() {
return nm;
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < nm; i++) {
buf.append(rows[i]).append("\n");
}
return buf.toString();
}
}