Repository: wangguanquan/eec
Pull request #209 (2021-09-06 01:12:07)

Fix#203
Support basic type and non-header doc


Patch:
diff --git a/src/main/java/org/ttzero/excel/entity/CSVSheet.java b/src/main/java/org/ttzero/excel/entity/CSVSheet.java
index ce0d4c53..f7981e64 100644
--- a/src/main/java/org/ttzero/excel/entity/CSVSheet.java
+++ b/src/main/java/org/ttzero/excel/entity/CSVSheet.java
@@ -153,14 +153,14 @@ public class CSVSheet extends Sheet {
      */
     @Override
     protected void resetBlockData() {
-        int len = columns.length, n = 0, limit = sheetWriter.getRowLimit() - 1;
+        int len = columns.length, n = 0, limit = getRowLimit();
         for (int rbs = getRowBlockSize(); n++ < rbs && rows < limit && iterator.hasNext(); rows++) {
             Row row = rowBlock.next();
             row.index = rows;
             Cell[] cells = row.realloc(len);
             String[] csvRow = iterator.next();
             for (int i = 0; i < len; i++) {
-                Column hc = columns[i];
+                org.ttzero.excel.entity.Column hc = columns[i];
 
                 // clear cells
                 Cell cell = cells[i];
@@ -181,39 +181,43 @@ public class CSVSheet extends Sheet {
     }
 
     @Override
-    public Column[] getHeaderColumns() {
+    protected org.ttzero.excel.entity.Column[] getHeaderColumns() {
         if (headerReady) return columns;
         try {
             // Create CSV iterator
             init();
             if (!iterator.hasNext()) return columns;
             String[] rows = iterator.next();
-            columns = new Column[rows.length];
+            columns = new org.ttzero.excel.entity.Column[rows.length];
             for (int i = 0; i < rows.length; i++) {
                 // FIXME the column type
-                columns[i] = new Column(hasHeader ? rows[i] : null, String.class);
+                columns[i] = new org.ttzero.excel.entity.Column(hasHeader ? rows[i] : null, String.class);
                 columns[i].styles = workbook.getStyles();
             }
-            headerReady = true;
-            if (hasNonHeader()) {
-                ((CSVUtil.SharedRowsIterator) iterator).retain();
-            }
         } catch (IOException e) {
             throw new ExcelWriteException(e);
         }
         return columns;
     }
 
-    /**
-     * Check empty header row
-     *
-     * @return true if none header row
-     */
     @Override
-    public boolean hasNonHeader() {
-        if (!hasHeader) {
-            hasHeader = !super.hasNonHeader();
+    public void checkColumnLimit() {
+        super.checkColumnLimit();
+        if (nonHeader == 1) {
+            ((CSVUtil.SharedRowsIterator) iterator).retain();
         }
-        return !hasHeader;
     }
+
+//    /**
+//     * Check empty header row
+//     *
+//     * @return true if none header row
+//     */
+//    @Override
+//    public boolean hasNonHeader() {
+//        if (!hasHeader) {
+//            hasHeader = !super.hasNonHeader();
+//        }
+//        return !hasHeader;
+//    }
 }
diff --git a/src/main/java/org/ttzero/excel/entity/CollectionSheet.java b/src/main/java/org/ttzero/excel/entity/CollectionSheet.java
index b2ef0f9a..604f5388 100644
--- a/src/main/java/org/ttzero/excel/entity/CollectionSheet.java
+++ b/src/main/java/org/ttzero/excel/entity/CollectionSheet.java
@@ -49,9 +49,9 @@ public class CollectionSheet<T> extends Sheet {
      * Constructor worksheet
      *
      * @param name the worksheet name
-     * @param columns the {@link Sheet.Column}
+     * @param columns the {@link org.ttzero.excel.entity.Column}
      */
-    public CollectionSheet(String name, final Column... columns) {
+    public CollectionSheet(String name, final org.ttzero.excel.entity.Column... columns) {
         super(name, columns);
     }
 
@@ -60,9 +60,9 @@ public class CollectionSheet<T> extends Sheet {
      *
      * @param name the worksheet name
      * @param waterMark the {@link WaterMark}
-     * @param columns the {@link Sheet.Column}
+     * @param columns the {@link org.ttzero.excel.entity.Column}
      */
-    public CollectionSheet(String name, WaterMark waterMark, final Column... columns) {
+    public CollectionSheet(String name, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
     }
 
diff --git a/src/main/java/org/ttzero/excel/entity/Column.java b/src/main/java/org/ttzero/excel/entity/Column.java
new file mode 100644
index 00000000..61b5fe0c
--- /dev/null
+++ b/src/main/java/org/ttzero/excel/entity/Column.java
@@ -0,0 +1,709 @@
+/*
+ * Copyright (c) 2017-2021, guanquan.wang@yandex.com 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.entity;
+
+import org.ttzero.excel.entity.style.Border;
+import org.ttzero.excel.entity.style.Fill;
+import org.ttzero.excel.entity.style.Font;
+import org.ttzero.excel.entity.style.Horizontals;
+import org.ttzero.excel.entity.style.NumFmt;
+import org.ttzero.excel.entity.style.Styles;
+import org.ttzero.excel.entity.style.Verticals;
+import org.ttzero.excel.processor.IntConversionProcessor;
+import org.ttzero.excel.processor.StyleProcessor;
+
+import static org.ttzero.excel.entity.IWorksheetWriter.isBigDecimal;
+import static org.ttzero.excel.entity.IWorksheetWriter.isBool;
+import static org.ttzero.excel.entity.IWorksheetWriter.isChar;
+import static org.ttzero.excel.entity.IWorksheetWriter.isDate;
+import static org.ttzero.excel.entity.IWorksheetWriter.isDateTime;
+import static org.ttzero.excel.entity.IWorksheetWriter.isDouble;
+import static org.ttzero.excel.entity.IWorksheetWriter.isFloat;
+import static org.ttzero.excel.entity.IWorksheetWriter.isInt;
+import static org.ttzero.excel.entity.IWorksheetWriter.isLocalDate;
+import static org.ttzero.excel.entity.IWorksheetWriter.isLocalDateTime;
+import static org.ttzero.excel.entity.IWorksheetWriter.isLocalTime;
+import static org.ttzero.excel.entity.IWorksheetWriter.isLong;
+import static org.ttzero.excel.entity.IWorksheetWriter.isString;
+import static org.ttzero.excel.entity.IWorksheetWriter.isTime;
+import static org.ttzero.excel.entity.style.Styles.INDEX_BORDER;
+
+/**
+ * Associated with Worksheet for controlling head style and cache
+ * column data types and conversions
+ *
+ * @author guanquan.wang at 2021-08-29 19:49
+ */
+public class Column {
+    /**
+     * The key of Map or field name of entry
+     */
+    public String key;
+    /**
+     * The header name
+     */
+    public String name;
+    /**
+     * The cell type
+     */
+    public Class<?> clazz;
+    /**
+     * The string value is shared
+     */
+    public boolean share;
+    /**
+     * The int value conversion
+     */
+    public IntConversionProcessor processor;
+    /**
+     * The style conversion
+     */
+    public StyleProcessor styleProcessor;
+    /**
+     * The style of cell
+     */
+    public int cellStyle;
+    /**
+     * The style of header
+     */
+    public int headerStyle;
+    /**
+     * The style index of cell, -1 if not be setting
+     */
+    private int cellStyleIndex = -1;
+    /**
+     * The style index of header, -1 if not be setting
+     */
+    private int headerStyleIndex = -1;
+    /**
+     * The cell width
+     */
+    public double width;
+    public int o;
+    public Styles styles;
+    public Comment headerComment, cellComment;
+    /**
+     * Specify the cell number format
+     */
+    public NumFmt numFmt;
+    /**
+     * Only export column name and ignore value
+     */
+    public boolean ignoreValue;
+    /**
+     * Wrap text in a cell
+     */
+    public int wrapText;
+    /**
+     * Specify the column index
+     */
+    public int colIndex = -1;
+
+    /**
+     * Constructor Column
+     */
+    public Column() { }
+
+    /**
+     * Constructor Column
+     *
+     * @param name  the column name
+     * @param clazz the cell type
+     */
+    public Column(String name, Class<?> clazz) {
+        this(name, clazz, true);
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name the column name
+     * @param key  field
+     */
+    public Column(String name, String key) {
+        this(name, key, true);
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name  the column name
+     * @param key   field
+     * @param clazz the cell type
+     */
+    public Column(String name, String key, Class<?> clazz) {
+        this(name, key, true);
+        this.clazz = clazz;
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param clazz     the cell type
+     * @param processor The int value conversion
+     */
+    public Column(String name, Class<?> clazz, IntConversionProcessor processor) {
+        this(name, clazz, processor, true);
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param key       field
+     * @param processor The int value conversion
+     */
+    public Column(String name, String key, IntConversionProcessor processor) {
+        this(name, key, processor, true);
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name  the column name
+     * @param clazz the cell type
+     * @param share true:shared false:inline string
+     */
+    public Column(String name, Class<?> clazz, boolean share) {
+        this.name = name;
+        this.clazz = clazz;
+        this.share = share;
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name  the column name
+     * @param key   filed
+     * @param share true:shared false:inline string
+     */
+    public Column(String name, String key, boolean share) {
+        this.name = name;
+        this.key = key;
+        this.share = share;
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param clazz     the cell type
+     * @param processor The int value conversion
+     * @param share     true:shared false:inline string
+     */
+    public Column(String name, Class<?> clazz, IntConversionProcessor processor, boolean share) {
+        this(name, clazz, share);
+        this.processor = processor;
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param key       field
+     * @param clazz     type of cell
+     * @param processor The int value conversion
+     */
+    public Column(String name, String key, Class<?> clazz, IntConversionProcessor processor) {
+        this(name, key, clazz);
+        this.processor = processor;
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param key       field
+     * @param processor The int value conversion
+     * @param share     true:shared false:inline string
+     */
+    public Column(String name, String key, IntConversionProcessor processor, boolean share) {
+        this(name, key, share);
+        this.processor = processor;
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param clazz     the cell type
+     * @param cellStyle the style of cell
+     */
+    public Column(String name, Class<?> clazz, int cellStyle) {
+        this(name, clazz, cellStyle, true);
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param key       field
+     * @param cellStyle the style of cell
+     */
+    public Column(String name, String key, int cellStyle) {
+        this(name, key, cellStyle, true);
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param clazz     the cell type
+     * @param cellStyle the style of cell
+     * @param share     true:shared false:inline string
+     */
+    public Column(String name, Class<?> clazz, int cellStyle, boolean share) {
+        this(name, clazz, share);
+        this.cellStyle = cellStyle;
+    }
+
+    /**
+     * Constructor Column
+     *
+     * @param name      the column name
+     * @param key       field
+     * @param cellStyle the style of cell
+     * @param share     true:shared false:inline string
+     */
+    public Column(String name, String key, int cellStyle, boolean share) {
+        this(name, key, share);
+        this.cellStyle = cellStyle;
+    }
+
+    /**
+     * Setting the cell's width
+     *
+     * @param width the width value
+     * @return the {@link Column}
+     */
+    public Column setWidth(double width) {
+        if (width < 0.00000001) {
+            throw new ExcelWriteException("Width " + width + " less than 0.");
+        }
+        this.width = width;
+        return this;
+    }
+
+    /**
+     * Setting the cell is shared
+     *
+     * @return true:shared false:inline string
+     */
+    public boolean isShare() {
+        return share;
+    }
+
+    /**
+     * Returns the column name
+     *
+     * @return the column name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Setting the column name
+     *
+     * @param name the column name
+     * @return the {@link Column}
+     */
+    public Column setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    /**
+     * Returns the cell type
+     *
+     * @return the cell type
+     */
+    public Class<?> getClazz() {
+        return clazz;
+    }
+
+    /**
+     * Setting the cell type
+     *
+     * @param clazz the cell type
+     * @return the {@link Column}
+     */
+    public Column setClazz(Class<?> clazz) {
+        this.clazz = clazz;
+        return this;
+    }
+
+    /**
+     * Setting the int value conversion
+     *
+     * @param processor The int value conversion
+     * @return the {@link Column}
+     */
+    public Column setProcessor(IntConversionProcessor processor) {
+        this.processor = processor;
+        return this;
+    }
+
+    /**
+     * Setting the style conversion
+     *
+     * @param styleProcessor The style conversion
+     * @return the {@link Column}
+     */
+    public Column setStyleProcessor(StyleProcessor styleProcessor) {
+        this.styleProcessor = styleProcessor;
+        return this;
+    }
+
+    /**
+     * Returns the width of cell
+     *
+     * @return the cell width
+     */
+    public double getWidth() {
+        return width;
+    }
+
+    /**
+     * Setting the cell's style
+     *
+     * @param cellStyle the styles value
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(int cellStyle) {
+        this.cellStyle = cellStyle;
+        this.cellStyleIndex = styles.of(cellStyle);
+        return this;
+    }
+
+    /**
+     * Setting the header's style
+     *
+     * @param headerStyle the styles value
+     * @return the {@link Column}
+     */
+    public Column setHeaderStyle(int headerStyle) {
+        this.headerStyle = headerStyle;
+        this.headerStyleIndex = styles.of(headerStyle);
+        return this;
+    }
+
+    /**
+     * Settings the x-axis of column in row
+     *
+     * @param colIndex column index (zero base)
+     * @return the {@link Column}
+     */
+    public Column setColIndex(int colIndex) {
+        this.colIndex = colIndex;
+        return this;
+    }
+
+    /**
+     * Returns the style index of cell, -1 if not be setting
+     *
+     * @return index of style
+     */
+    public int getCellStyleIndex() {
+        return cellStyleIndex;
+    }
+
+    /**
+     * Returns the header style index of cell, -1 if not be setting
+     *
+     * @return index of style
+     */
+    public int getHeaderStyleIndex() {
+        return headerStyleIndex;
+    }
+
+    /**
+     * Returns the default horizontal style
+     * the Date, Character, Bool has center value, the
+     * Numeric has right value, otherwise left value
+     *
+     * @return the horizontal value
+     */
+    int defaultHorizontal() {
+        int horizontal;
+        if (isDate(clazz) || isDateTime(clazz)
+                || isLocalDate(clazz) || isLocalDateTime(clazz)
+                || isTime(clazz) || isLocalTime(clazz)
+                || isChar(clazz) || isBool(clazz)) {
+            horizontal = Horizontals.CENTER;
+        } else if (isInt(clazz) || isLong(clazz)
+                || isFloat(clazz) || isDouble(clazz)
+                || isBigDecimal(clazz)) {
+            horizontal = Horizontals.RIGHT;
+        } else {
+            horizontal = Horizontals.LEFT;
+        }
+        return horizontal;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @param font the font
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(Font font) {
+        this.cellStyle = styles.of(
+                (font != null ? styles.addFont(font) : 0)
+                        | Verticals.CENTER
+                        | defaultHorizontal());
+        return this;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @param font       the font
+     * @param horizontal the horizontal style
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(Font font, int horizontal) {
+        this.cellStyle = styles.of(
+                (font != null ? styles.addFont(font) : 0)
+                        | Verticals.CENTER
+                        | horizontal);
+        return this;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @param font   the font
+     * @param border the border style
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(Font font, Border border) {
+        this.cellStyle = styles.of(
+                (font != null ? styles.addFont(font) : 0)
+                        | (border != null ? styles.addBorder(border) : 0)
+                        | Verticals.CENTER
+                        | defaultHorizontal());
+        return this;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @param font       the font
+     * @param border     the border style
+     * @param horizontal the horizontal style
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(Font font, Border border, int horizontal) {
+        this.cellStyle = styles.of(
+                (font != null ? styles.addFont(font) : 0)
+                        | (border != null ? styles.addBorder(border) : 0)
+                        | Verticals.CENTER
+                        | horizontal);
+        return this;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @param font   the font
+     * @param fill   the fill style
+     * @param border the border style
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(Font font, Fill fill, Border border) {
+        this.cellStyle = styles.of(
+                (font != null ? styles.addFont(font) : 0)
+                        | (fill != null ? styles.addFill(fill) : 0)
+                        | (border != null ? styles.addBorder(border) : 0)
+                        | Verticals.CENTER
+                        | defaultHorizontal());
+        return this;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @param font       the font
+     * @param fill       the fill style
+     * @param border     the border style
+     * @param horizontal the horizontal style
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(Font font, Fill fill, Border border, int horizontal) {
+        this.cellStyle = styles.of(
+                (font != null ? styles.addFont(font) : 0)
+                        | (fill != null ? styles.addFill(fill) : 0)
+                        | (border != null ? styles.addBorder(border) : 0)
+                        | Verticals.CENTER
+                        | horizontal);
+        return this;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @param font       the font
+     * @param fill       the fill style
+     * @param border     the border style
+     * @param vertical   the vertical style
+     * @param horizontal the horizontal style
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(Font font, Fill fill, Border border, int vertical, int horizontal) {
+        this.cellStyle = styles.of(
+                (font != null ? styles.addFont(font) : 0)
+                        | (fill != null ? styles.addFill(fill) : 0)
+                        | (border != null ? styles.addBorder(border) : 0)
+                        | vertical
+                        | horizontal);
+        return this;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @param numFmt     the number format
+     * @param font       the font
+     * @param fill       the fill style
+     * @param border     the border style
+     * @param vertical   the vertical style
+     * @param horizontal the horizontal style
+     * @return the {@link Column}
+     */
+    public Column setCellStyle(NumFmt numFmt, Font font, Fill fill, Border border, int vertical, int horizontal) {
+        this.cellStyle = styles.of(
+                (numFmt != null ? styles.addNumFmt(numFmt) : 0)
+                        | (font != null ? styles.addFont(font) : 0)
+                        | (fill != null ? styles.addFill(fill) : 0)
+                        | (border != null ? styles.addBorder(border) : 0)
+                        | vertical
+                        | horizontal);
+        return this;
+    }
+
+    /**
+     * Setting cell string value is shared
+     * Shared is only valid for strings, and the converted cell type
+     * is also valid for strings.
+     *
+     * @param share true:shared false:inline string
+     * @return the {@link Column}
+     */
+    public Column setShare(boolean share) {
+        this.share = share;
+        return this;
+    }
+
+    /**
+     * Setting a cell format of number or date type
+     *
+     * @param code the format string
+     * @return the {@link Column}
+     */
+    public Column setNumFmt(String code) {
+        this.numFmt = new NumFmt(code);
+        return this;
+    }
+
+    /**
+     * Returns the column {@link NumFmt}
+     *
+     * @return number format
+     */
+    public NumFmt getNumFmt() {
+        return numFmt != null ? numFmt : styles.getNumFmt(cellStyle);
+    }
+
+    /**
+     * Returns default style based on cell type
+     *
+     * @param clazz the cell type
+     * @return the styles value
+     */
+    public int getCellStyle(Class<?> clazz) {
+        int style;
+        if (isString(clazz)) {
+            style = Styles.defaultStringBorderStyle() | wrapText;
+        } else if (isDateTime(clazz) || isLocalDateTime(clazz)) {
+            style = styles.addNumFmt(new NumFmt("yyyy\\-mm\\-dd\\ hh:mm:ss")) | (1 << INDEX_BORDER) | Horizontals.CENTER;
+        } else if (isDate(clazz) || isLocalDate(clazz)) {
+            style = styles.addNumFmt(new NumFmt("yyyy\\-mm\\-dd")) | (1 << INDEX_BORDER) | Horizontals.CENTER;
+        } else if (isBool(clazz) || isChar(clazz)) {
+            style = Styles.clearHorizontal(Styles.defaultStringBorderStyle()) | Horizontals.CENTER;
+        } else if (isInt(clazz) || isLong(clazz)) {
+            style = Styles.defaultIntBorderStyle();
+        } else if (isFloat(clazz) || isDouble(clazz) || isBigDecimal(clazz)) {
+            style = Styles.defaultDoubleBorderStyle();
+        } else if (isTime(clazz) || isLocalTime(clazz)) {
+            style =  styles.addNumFmt(new NumFmt("hh:mm:ss")) | (1 << INDEX_BORDER) | Horizontals.CENTER;
+        } else {
+            style = (1 << Styles.INDEX_FONT) | (1 << INDEX_BORDER); // Auto-style
+        }
+
+        // Reset custom number format if specified.
+        if (numFmt != null) {
+            style = Styles.clearNumFmt(style) | styles.addNumFmt(numFmt);
+        }
+
+        return style;
+    }
+
+    /**
+     * Setting the cell styles
+     *
+     * @return the styles value
+     */
+    public int getCellStyle() {
+        if (cellStyleIndex != -1) {
+            return cellStyle;
+        }
+        setCellStyle(getCellStyle(clazz));
+        return cellStyle;
+    }
+
+    /**
+     * @return bool
+     */
+    public boolean isIgnoreValue() {
+        return ignoreValue;
+    }
+
+    /**
+     * Ignore value
+     */
+    public Column ignoreValue() {
+        this.ignoreValue = true;
+        return this;
+    }
+
+    /**
+     * Wrap text in a cell
+     * <p>
+     * Microsoft Excel can wrap text so it appears on multiple lines in a cell.
+     * You can format the cell so the text wraps automatically, or enter a manual line break.
+     *
+     * @param wrapText set wrap
+     * @return the {@link Column} self
+     */
+    public Column setWrapText(boolean wrapText) {
+        this.wrapText = wrapText ? 1 : 0;
+        return this;
+    }
+}
diff --git a/src/main/java/org/ttzero/excel/entity/EmptySheet.java b/src/main/java/org/ttzero/excel/entity/EmptySheet.java
index 05186753..08600879 100644
--- a/src/main/java/org/ttzero/excel/entity/EmptySheet.java
+++ b/src/main/java/org/ttzero/excel/entity/EmptySheet.java
@@ -43,7 +43,7 @@ public class EmptySheet extends Sheet {
      * @param name    the worksheet name
      * @param columns the header info
      */
-    public EmptySheet(String name, final Column... columns) {
+    public EmptySheet(String name, final org.ttzero.excel.entity.Column... columns) {
         super(name, columns);
     }
 
@@ -54,7 +54,7 @@ public class EmptySheet extends Sheet {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public EmptySheet(String name, WaterMark waterMark, final Column... columns) {
+    public EmptySheet(String name, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
     }
 
diff --git a/src/main/java/org/ttzero/excel/entity/ICellValueAndStyle.java b/src/main/java/org/ttzero/excel/entity/ICellValueAndStyle.java
index 77124233..e8fbf932 100644
--- a/src/main/java/org/ttzero/excel/entity/ICellValueAndStyle.java
+++ b/src/main/java/org/ttzero/excel/entity/ICellValueAndStyle.java
@@ -50,7 +50,7 @@ public interface ICellValueAndStyle {
      * @param e    the cell value
      * @param hc   the header column
      */
-    void reset(int row, Cell cell, Object e, Sheet.Column hc);
+    void reset(int row, Cell cell, Object e, Column hc);
 
     /**
      * Returns the worksheet name
@@ -67,7 +67,7 @@ public interface ICellValueAndStyle {
      * @param o  the cell value
      * @return the style index in xf
      */
-    int getStyleIndex(int rows, Sheet.Column hc, Object o);
+    int getStyleIndex(int rows, Column hc, Object o);
 
     /**
      * Setting cell value
@@ -78,7 +78,7 @@ public interface ICellValueAndStyle {
      * @param hc    the header column
      * @param clazz the cell value type
      */
-    default void setCellValue(int row, Cell cell, Object e, Sheet.Column hc, Class<?> clazz) {
+    default void setCellValue(int row, Cell cell, Object e, Column hc, Class<?> clazz) {
         if (e == null) {
             setNullValue(row, cell, hc);
             return;
@@ -132,7 +132,7 @@ public interface ICellValueAndStyle {
      * @param cell  the cell
      * @param hc    the header column
      */
-    default void setNullValue(int row, Cell cell, Sheet.Column hc) {
+    default void setNullValue(int row, Cell cell, Column hc) {
         boolean hasIntProcessor = hc.processor != null;
         if (hasIntProcessor) {
             conversion(row, cell, 0, hc);
@@ -148,7 +148,7 @@ public interface ICellValueAndStyle {
      * @param n    the cell value
      * @param hc   the header column
      */
-    default void conversion(int row, Cell cell, int n, Sheet.Column hc) {
+    default void conversion(int row, Cell cell, int n, Column hc) {
         Object e = hc.processor.conversion(n);
         if (e != null) {
             Class<?> clazz = e.getClass();
diff --git a/src/main/java/org/ttzero/excel/entity/ListMapSheet.java b/src/main/java/org/ttzero/excel/entity/ListMapSheet.java
index 8eeaced6..9598ea33 100644
--- a/src/main/java/org/ttzero/excel/entity/ListMapSheet.java
+++ b/src/main/java/org/ttzero/excel/entity/ListMapSheet.java
@@ -56,7 +56,7 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
      * @param name    the worksheet name
      * @param columns the header info
      */
-    public ListMapSheet(String name, final Column... columns) {
+    public ListMapSheet(String name, final org.ttzero.excel.entity.Column... columns) {
         super(name, columns);
     }
 
@@ -67,7 +67,7 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ListMapSheet(String name, WaterMark waterMark, final Column... columns) {
+    public ListMapSheet(String name, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
     }
 
@@ -98,7 +98,7 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
      * @param data    the worksheet's body data
      * @param columns the header info
      */
-    public ListMapSheet(List<Map<String, ?>> data, final Column... columns) {
+    public ListMapSheet(List<Map<String, ?>> data, final org.ttzero.excel.entity.Column... columns) {
         this(null, data, columns);
     }
 
@@ -109,7 +109,7 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
      * @param data    the worksheet's body data
      * @param columns the header info
      */
-    public ListMapSheet(String name, List<Map<String, ?>> data, final Column... columns) {
+    public ListMapSheet(String name, List<Map<String, ?>> data, final org.ttzero.excel.entity.Column... columns) {
         this(name, data, null, columns);
     }
 
@@ -120,7 +120,7 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ListMapSheet(List<Map<String, ?>> data, WaterMark waterMark, final Column... columns) {
+    public ListMapSheet(List<Map<String, ?>> data, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         this(null, data, waterMark, columns);
     }
 
@@ -132,7 +132,7 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ListMapSheet(String name, List<Map<String, ?>> data, WaterMark waterMark, final Column... columns) {
+    public ListMapSheet(String name, List<Map<String, ?>> data, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
         setData(data);
     }
@@ -152,7 +152,7 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
             row.index = rows;
             Cell[] cells = row.realloc(len);
             for (int i = 0; i < len; i++) {
-                Column hc = columns[i];
+                org.ttzero.excel.entity.Column hc = columns[i];
                 Object e = data.get(start).get(hc.key);
                 // clear cells
                 Cell cell = cells[i];
@@ -170,27 +170,27 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
      * @return array of column
      */
     @Override
-    public Column[] getHeaderColumns() {
+    protected org.ttzero.excel.entity.Column[] getHeaderColumns() {
         if (headerReady) return columns;
         Map<String, ?> first = getFirst();
         // No data
         if (first == null) {
             if (columns == null) {
-                columns = new Column[0];
+                columns = new org.ttzero.excel.entity.Column[0];
             }
         } else if (!hasHeaderColumns()) {
             int size = first.size(), i = 0;
-            columns = new Column[size];
+            columns = new org.ttzero.excel.entity.Column[size];
             for (Iterator<? extends Map.Entry<String, ?>> it = first.entrySet().iterator(); it.hasNext(); ) {
                 Map.Entry<String, ?> entry = it.next();
                 // Ignore the null key
                 if (isEmpty(entry.getKey())) continue;
                 Object value = entry.getValue();
-                columns[i++] = new Column(entry.getKey(), entry.getKey(), value != null ? value.getClass() : String.class);
+                columns[i++] = new org.ttzero.excel.entity.Column(entry.getKey(), entry.getKey(), value != null ? value.getClass() : String.class);
             }
         } else {
             for (int i = 0; i < columns.length; i++) {
-                Column hc = columns[i];
+                org.ttzero.excel.entity.Column hc = columns[i];
                 if (isEmpty(hc.key)) {
                     throw new ExcelWriteException(getClass() + " must specify the 'key' name.");
                 }
@@ -200,10 +200,6 @@ public class ListMapSheet extends ListSheet<Map<String, ?>> {
             }
         }
 
-        for (Column hc : columns) {
-            hc.styles = workbook.getStyles();
-        }
-        headerReady = columns.length > 0;
         return columns;
     }
 
diff --git a/src/main/java/org/ttzero/excel/entity/ListSheet.java b/src/main/java/org/ttzero/excel/entity/ListSheet.java
index 45c4eef3..f8c9e406 100644
--- a/src/main/java/org/ttzero/excel/entity/ListSheet.java
+++ b/src/main/java/org/ttzero/excel/entity/ListSheet.java
@@ -88,7 +88,7 @@ public class ListSheet<T> extends Sheet {
      * @param name    the worksheet name
      * @param columns the header info
      */
-    public ListSheet(String name, final Column... columns) {
+    public ListSheet(String name, final org.ttzero.excel.entity.Column... columns) {
         super(name, columns);
     }
 
@@ -99,7 +99,7 @@ public class ListSheet<T> extends Sheet {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ListSheet(String name, WaterMark waterMark, final Column... columns) {
+    public ListSheet(String name, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
     }
 
@@ -129,7 +129,7 @@ public class ListSheet<T> extends Sheet {
      * @param data    the worksheet's body data
      * @param columns the header info
      */
-    public ListSheet(List<T> data, final Column... columns) {
+    public ListSheet(List<T> data, final org.ttzero.excel.entity.Column... columns) {
         this(null, data, columns);
     }
 
@@ -140,7 +140,7 @@ public class ListSheet<T> extends Sheet {
      * @param data    the worksheet's body data
      * @param columns the header info
      */
-    public ListSheet(String name, List<T> data, final Column... columns) {
+    public ListSheet(String name, List<T> data, final org.ttzero.excel.entity.Column... columns) {
         this(name, data, null, columns);
     }
 
@@ -151,7 +151,7 @@ public class ListSheet<T> extends Sheet {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ListSheet(List<T> data, WaterMark waterMark, final Column... columns) {
+    public ListSheet(List<T> data, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         this(null, data, waterMark, columns);
     }
 
@@ -163,7 +163,7 @@ public class ListSheet<T> extends Sheet {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ListSheet(String name, List<T> data, WaterMark waterMark, final Column... columns) {
+    public ListSheet(String name, List<T> data, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
         setData(data);
     }
@@ -211,7 +211,7 @@ public class ListSheet<T> extends Sheet {
     @Override
     public void close() throws IOException {
         // Maybe there has more data
-        if (!eof && rows >= sheetWriter.getRowLimit() - 1) {
+        if (!eof && rows >= getRowLimit()) {
             List<T> list = more();
             if (list != null && !list.isEmpty()) {
                 compact();
@@ -262,8 +262,9 @@ public class ListSheet<T> extends Sheet {
                         e = null;
                     else if (column.getMethod() != null)
                         e = column.getMethod().invoke(o);
-                    else
+                    else if (column.getField() != null)
                         e = column.getField().get(o);
+                    else e = o;
 
                     cellValueAndStyle.reset(rows, cell, e, columns[i]);
                 }
@@ -378,7 +379,7 @@ public class ListSheet<T> extends Sheet {
 
         if (!hasHeaderColumns()) {
             // Get ExcelColumn annotation method
-            List<Column> list = new ArrayList<>(declaredFields.length);
+            List<org.ttzero.excel.entity.Column> list = new ArrayList<>(declaredFields.length);
 
             for (int i = 0; i < declaredFields.length; i++) {
                 Field field = declaredFields[i];
@@ -404,7 +405,6 @@ public class ListSheet<T> extends Sheet {
                         column.field = field;
                         column.clazz = method.getReturnType();
                         column.key = gs;
-                        column.styles = workbook.getStyles();
                         if (isEmpty(column.name)) {
                             column.name = gs;
                         }
@@ -427,7 +427,6 @@ public class ListSheet<T> extends Sheet {
                     list.add(column);
                     column.field = field;
                     column.key = gs;
-                    column.styles = workbook.getStyles();
                     if (isEmpty(column.name)) {
                         column.name = gs;
                     }
@@ -444,7 +443,7 @@ public class ListSheet<T> extends Sheet {
             }
 
             // Attach some custom column
-            List<Column> attachList = attachOtherColumn(tmp, clazz);
+            List<org.ttzero.excel.entity.Column> attachList = attachOtherColumn(tmp, clazz);
             if (attachList != null) list.addAll(attachList);
 
             // No column to write
@@ -454,11 +453,11 @@ public class ListSheet<T> extends Sheet {
                 LOGGER.warn("Class [{}] do not contains properties to export.", clazz);
                 return 0;
             }
-            columns = new Column[list.size()];
+            columns = new org.ttzero.excel.entity.Column[list.size()];
             list.toArray(columns);
         } else {
             for (int i = 0; i < columns.length; i++) {
-                Column hc = columns[i];
+                org.ttzero.excel.entity.Column hc = columns[i];
                 if (!(hc instanceof EntryColumn)) {
                     hc = new EntryColumn(hc);
                     columns[i] = hc;
@@ -471,7 +470,7 @@ public class ListSheet<T> extends Sheet {
                 ec.method = method;
 
                 for (Field field : declaredFields) {
-                    if (hc.key.equals(field.getName())) {
+                    if (field.getName().equals(hc.key)) {
                         field.setAccessible(true);
                         ec.field = field;
                         break;
@@ -498,15 +497,7 @@ public class ListSheet<T> extends Sheet {
         }
 
         // Merge Header Style defined on Entry Class
-        HeaderStyle headerStyle = clazz.getDeclaredAnnotation(HeaderStyle.class);
-        int style = 0;
-        if (headerStyle != null) {
-            style = buildHeadStyle(headerStyle.fontColor(), headerStyle.fillFgColor());
-        }
-        for (Column column : columns) {
-            if (style > 0 && column.getHeaderStyleIndex() == -1)
-                column.setHeaderStyle(style);
-        }
+        mergeGlobalSetting(clazz);
 
         return columns.length;
     }
@@ -527,6 +518,7 @@ public class ListSheet<T> extends Sheet {
         ExcelColumn ec = ao.getAnnotation(ExcelColumn.class);
         if (ec != null) {
             EntryColumn column = new EntryColumn(ec.value(), EMPTY, ec.share());
+            column.styles = workbook.getStyles();
             // Number format
             if (isNotEmpty(ec.format())) {
                 column.setNumFmt(ec.format());
@@ -542,7 +534,14 @@ public class ListSheet<T> extends Sheet {
         return null;
     }
 
-    protected void buildHeaderStyle(AccessibleObject main, AccessibleObject sub, Column column) {
+    /**
+     * Build header style
+     *
+     * @param main the getter method
+     * @param sub the defined field
+     * @param column the header column
+     */
+    protected void buildHeaderStyle(AccessibleObject main, AccessibleObject sub, org.ttzero.excel.entity.Column column) {
         HeaderStyle hs = null;
         if (main != null) {
             hs = main.getAnnotation(HeaderStyle.class);
@@ -555,7 +554,14 @@ public class ListSheet<T> extends Sheet {
         }
     }
 
-    protected void buildHeaderComment(AccessibleObject main, AccessibleObject sub, Column column) {
+    /**
+     * Build header comment
+     *
+     * @param main the getter method
+     * @param sub the defined field
+     * @param column the header column
+     */
+    protected void buildHeaderComment(AccessibleObject main, AccessibleObject sub, org.ttzero.excel.entity.Column column) {
         HeaderComment comment = null;
         if (main != null) {
             comment = main.getAnnotation(HeaderComment.class);
@@ -576,6 +582,23 @@ public class ListSheet<T> extends Sheet {
         }
     }
 
+    /**
+     * Merge Header Style defined on Entry Class
+     *
+     * @param clazz  Class of &lt;T&gt;
+     */
+    protected void mergeGlobalSetting(Class<?> clazz) {
+        HeaderStyle headerStyle = clazz.getDeclaredAnnotation(HeaderStyle.class);
+        int style = 0;
+        if (headerStyle != null) {
+            style = buildHeadStyle(headerStyle.fontColor(), headerStyle.fillFgColor());
+        }
+        for (org.ttzero.excel.entity.Column column : columns) {
+            if (style > 0 && column.getHeaderStyleIndex() == -1)
+                column.setHeaderStyle(style);
+        }
+    }
+
     /**
      * Ignore some columns, override this method to add custom filtering
      *
@@ -591,9 +614,9 @@ public class ListSheet<T> extends Sheet {
      *
      * @param existsMethodMapper all exists method collection by default
      * @param clazz Class of &lt;T&gt;
-     * @return list of {@link Column} or null if no more columns to attach
+     * @return list of {@link org.ttzero.excel.entity.Column} or null if no more columns to attach
      */
-    protected List<Column> attachOtherColumn(Map<String, Method> existsMethodMapper, Class<?> clazz) {
+    protected List<org.ttzero.excel.entity.Column> attachOtherColumn(Map<String, Method> existsMethodMapper, Class<?> clazz) {
         // Collect the method which has ExcelColumn annotation
         Method[] readMethods = null;
         try {
@@ -606,7 +629,7 @@ public class ListSheet<T> extends Sheet {
 
         if (readMethods != null) {
             Set<Method> existsMethods = new HashSet<>(existsMethodMapper.values());
-            List<Column> list = new ArrayList<>();
+            List<org.ttzero.excel.entity.Column> list = new ArrayList<>();
             for (Method method : readMethods) {
                 // Exclusions exists
                 if (existsMethods.contains(method)) continue;
@@ -616,7 +639,6 @@ public class ListSheet<T> extends Sheet {
                     column.method = method;
                     column.clazz = method.getReturnType();
                     column.key = method.getName();
-                    column.styles = workbook.getStyles();
                     if (isEmpty(column.name)) {
                         column.name = method.getName();
                     }
@@ -638,14 +660,12 @@ public class ListSheet<T> extends Sheet {
      * @return array of column
      */
     @Override
-    public Column[] getHeaderColumns() {
+    protected org.ttzero.excel.entity.Column[] getHeaderColumns() {
         if (!headerReady) {
             // create header columns
             int size = init();
             if (size <= 0) {
-                columns = new Column[0];
-            } else {
-                headerReady = true;
+                columns = new org.ttzero.excel.entity.Column[0];
             }
         }
         return columns;
@@ -657,7 +677,7 @@ public class ListSheet<T> extends Sheet {
      * @return the end index
      */
     protected int getEndIndex() {
-        int blockSize = getRowBlockSize(), rowLimit = sheetWriter.getRowLimit() - 1;
+        int blockSize = getRowBlockSize(), rowLimit = getRowLimit();
         if (rows + blockSize > rowLimit) {
             blockSize = rowLimit - rows;
         }
@@ -689,7 +709,7 @@ public class ListSheet<T> extends Sheet {
      */
     @Override
     protected void paging() {
-        int len = dataSize(), limit = sheetWriter.getRowLimit() - 1;
+        int len = dataSize(), limit = getRowLimit();
         // paging
         if (len + rows > limit) {
             // Reset current index
@@ -745,12 +765,14 @@ public class ListSheet<T> extends Sheet {
         return null;
     }
 
-    public static class EntryColumn extends Column {
+    public static class EntryColumn extends org.ttzero.excel.entity.Column {
         Method method;
         Field field;
 
         public EntryColumn() { }
-
+        public EntryColumn(String name) {
+            this.name = name;
+        }
         public EntryColumn(String name, Class<?> clazz) {
             super(name, clazz);
         }
@@ -807,12 +829,11 @@ public class ListSheet<T> extends Sheet {
             super(name, key, cellStyle, share);
         }
 
-        public EntryColumn(Column other) {
+        public EntryColumn(org.ttzero.excel.entity.Column other) {
             this.key = other.key;
             this.name = other.name;
             this.clazz = other.clazz;
             this.share = other.share;
-            this.type = other.type;
             this.processor = other.processor;
             this.styleProcessor = other.styleProcessor;
             this.width = other.width;
diff --git a/src/main/java/org/ttzero/excel/entity/NameValue.java b/src/main/java/org/ttzero/excel/entity/NameValue.java
deleted file mode 100644
index 5b79bea1..00000000
--- a/src/main/java/org/ttzero/excel/entity/NameValue.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2017, guanquan.wang@yandex.com 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.entity;
-
-/**
- * @author guanquan.wang on 2017/9/26.
- */
-public class NameValue {
-    private String name;
-    private String value;
-
-    public NameValue() {
-    }
-
-    public NameValue(String name, String value) {
-        this.name = name;
-        this.value = value;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getValue() {
-        return value;
-    }
-}
diff --git a/src/main/java/org/ttzero/excel/entity/ResultSetSheet.java b/src/main/java/org/ttzero/excel/entity/ResultSetSheet.java
index 168199bc..87dc15c7 100644
--- a/src/main/java/org/ttzero/excel/entity/ResultSetSheet.java
+++ b/src/main/java/org/ttzero/excel/entity/ResultSetSheet.java
@@ -81,7 +81,7 @@ public class ResultSetSheet extends Sheet {
      * @param name    the worksheet name
      * @param columns the header info
      */
-    public ResultSetSheet(String name, final Column... columns) {
+    public ResultSetSheet(String name, final org.ttzero.excel.entity.Column... columns) {
         super(name, columns);
     }
 
@@ -92,7 +92,7 @@ public class ResultSetSheet extends Sheet {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ResultSetSheet(String name, WaterMark waterMark, final Column... columns) {
+    public ResultSetSheet(String name, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
     }
 
@@ -122,7 +122,7 @@ public class ResultSetSheet extends Sheet {
      * @param rs      the ResultSet
      * @param columns the header info
      */
-    public ResultSetSheet(ResultSet rs, final Column... columns) {
+    public ResultSetSheet(ResultSet rs, final org.ttzero.excel.entity.Column... columns) {
         this(null, rs, null, columns);
     }
 
@@ -133,7 +133,7 @@ public class ResultSetSheet extends Sheet {
      * @param rs      the ResultSet
      * @param columns the header info
      */
-    public ResultSetSheet(String name, ResultSet rs, final Column... columns) {
+    public ResultSetSheet(String name, ResultSet rs, final org.ttzero.excel.entity.Column... columns) {
         this(name, rs, null, columns);
     }
 
@@ -144,7 +144,7 @@ public class ResultSetSheet extends Sheet {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ResultSetSheet(ResultSet rs, WaterMark waterMark, final Column... columns) {
+    public ResultSetSheet(ResultSet rs, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         this(null, rs, waterMark, columns);
     }
 
@@ -156,7 +156,7 @@ public class ResultSetSheet extends Sheet {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public ResultSetSheet(String name, ResultSet rs, WaterMark waterMark, final Column... columns) {
+    public ResultSetSheet(String name, ResultSet rs, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
         this.rs = rs;
     }
@@ -194,7 +194,7 @@ public class ResultSetSheet extends Sheet {
      */
     @Override
     protected void resetBlockData() {
-        int len = columns.length, n = 0, limit = sheetWriter.getRowLimit() - 1;
+        int len = columns.length, n = 0, limit = getRowLimit();
 
         try {
             for (int rbs = getRowBlockSize(); n++ < rbs && rows < limit && rs.next(); rows++) {
@@ -252,7 +252,7 @@ public class ResultSetSheet extends Sheet {
      * @return the header information
      */
     @Override
-    public Column[] getHeaderColumns() {
+    protected org.ttzero.excel.entity.Column[] getHeaderColumns() {
         if (headerReady) return columns;
         if (rs == null) {
             throw new ExcelWriteException("Constructor worksheet error.\nMiss the parameter ResultSet");
@@ -261,7 +261,7 @@ public class ResultSetSheet extends Sheet {
         try {
             ResultSetMetaData metaData = rs.getMetaData();
             if (hasHeaderColumns()) {
-                Column[] newColumns = new SQLColumn[columns.length];
+                org.ttzero.excel.entity.Column[] newColumns = new SQLColumn[columns.length];
                 for (; i < columns.length; i++) {
                     SQLColumn column = SQLColumn.of(columns[i]);
                     newColumns[i] = column;
@@ -280,7 +280,7 @@ public class ResultSetSheet extends Sheet {
                 columns = newColumns;
             } else {
                 int count = metaData.getColumnCount();
-                columns = new Column[count];
+                columns = new org.ttzero.excel.entity.Column[count];
                 for (; ++i <= count; ) {
                     columns[i - 1] = new SQLColumn(metaData.getColumnLabel(i), metaData.getColumnType(i)
                         , columnTypeToClass(metaData.getColumnType(i)));
@@ -296,11 +296,7 @@ public class ResultSetSheet extends Sheet {
                 if (StringUtil.isEmpty(columns[i].getName())) {
                     columns[i].setName(String.valueOf(i));
                 }
-                if (columns[i].styles == null) {
-                    columns[i].styles = workbook.getStyles();
-                }
             }
-            headerReady = columns.length > 0;
         }
         return columns;
     }
@@ -337,7 +333,7 @@ public class ResultSetSheet extends Sheet {
         return clazz;
     }
 
-    private static class SQLColumn extends Column {
+    private static class SQLColumn extends org.ttzero.excel.entity.Column {
         int sqlType;
 
         public SQLColumn(String name, int sqlType, Class<?> clazz) {
@@ -345,13 +341,12 @@ public class ResultSetSheet extends Sheet {
             this.sqlType = sqlType;
         }
 
-        public static SQLColumn of(Column other) {
+        public static SQLColumn of(org.ttzero.excel.entity.Column other) {
             SQLColumn self = new SQLColumn(other.name, 0, other.clazz);
             self.key = other.key;
             self.name = other.name;
             self.clazz = other.clazz;
             self.share = other.share;
-            self.type = other.type;
             self.processor = other.processor;
             self.styleProcessor = other.styleProcessor;
             self.cellStyle = other.cellStyle;
diff --git a/src/main/java/org/ttzero/excel/entity/Sheet.java b/src/main/java/org/ttzero/excel/entity/Sheet.java
index 567c78e0..a07a9550 100644
--- a/src/main/java/org/ttzero/excel/entity/Sheet.java
+++ b/src/main/java/org/ttzero/excel/entity/Sheet.java
@@ -31,7 +31,6 @@ import org.ttzero.excel.entity.style.Verticals;
 import org.ttzero.excel.manager.Const;
 import org.ttzero.excel.manager.RelManager;
 import org.ttzero.excel.processor.IntConversionProcessor;
-import org.ttzero.excel.processor.StyleProcessor;
 import org.ttzero.excel.reader.Cell;
 import org.ttzero.excel.util.FileUtil;
 
@@ -43,21 +42,6 @@ import java.io.ObjectOutputStream;
 import java.lang.reflect.InvocationTargetException;
 import java.nio.file.Path;
 
-import static org.ttzero.excel.entity.IWorksheetWriter.isBigDecimal;
-import static org.ttzero.excel.entity.IWorksheetWriter.isBool;
-import static org.ttzero.excel.entity.IWorksheetWriter.isChar;
-import static org.ttzero.excel.entity.IWorksheetWriter.isDate;
-import static org.ttzero.excel.entity.IWorksheetWriter.isDateTime;
-import static org.ttzero.excel.entity.IWorksheetWriter.isDouble;
-import static org.ttzero.excel.entity.IWorksheetWriter.isFloat;
-import static org.ttzero.excel.entity.IWorksheetWriter.isInt;
-import static org.ttzero.excel.entity.IWorksheetWriter.isLocalDate;
-import static org.ttzero.excel.entity.IWorksheetWriter.isLocalDateTime;
-import static org.ttzero.excel.entity.IWorksheetWriter.isLocalTime;
-import static org.ttzero.excel.entity.IWorksheetWriter.isLong;
-import static org.ttzero.excel.entity.IWorksheetWriter.isString;
-import static org.ttzero.excel.entity.IWorksheetWriter.isTime;
-import static org.ttzero.excel.entity.style.Styles.INDEX_BORDER;
 import static org.ttzero.excel.manager.Const.ROW_BLOCK_SIZE;
 import static org.ttzero.excel.util.StringUtil.isEmpty;
 
@@ -101,7 +85,7 @@ public abstract class Sheet implements Cloneable, Storable {
     protected Workbook workbook;
 
     protected String name;
-    protected Column[] columns;
+    protected org.ttzero.excel.entity.Column[] columns;
     protected WaterMark waterMark;
     protected RelManager relManager;
     protected int id;
@@ -168,6 +152,13 @@ public abstract class Sheet implements Cloneable, Storable {
      */
     protected int forceExport;
 
+    /**
+     * Ignore header when export
+     */
+    protected int nonHeader = -1;
+
+    private int rowLimit;
+
     public int getId() {
         return id;
     }
@@ -204,7 +195,7 @@ public abstract class Sheet implements Cloneable, Storable {
      * @param name    the worksheet name
      * @param columns the header info
      */
-    public Sheet(String name, final Column... columns) {
+    public Sheet(String name, final org.ttzero.excel.entity.Column... columns) {
         this(name, null, columns);
     }
 
@@ -215,7 +206,7 @@ public abstract class Sheet implements Cloneable, Storable {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public Sheet(String name, WaterMark waterMark, final Column... columns) {
+    public Sheet(String name, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         this.name = name;
         this.columns = columns;
         this.waterMark = waterMark;
@@ -223,705 +214,89 @@ public abstract class Sheet implements Cloneable, Storable {
     }
 
     /**
-     * Associated with Worksheet for controlling head style and cache
-     * column data types and conversions
+     * Will be deleted soon
+     *
+     * @deprecated use the new {@link org.ttzero.excel.entity.Column}
      */
-    public static class Column {
-        /**
-         * The key of Map or field name of entry
-         */
-        public String key;
-        /**
-         * The header name
-         */
-        public String name;
-        /**
-         * The cell type
-         */
-        public Class<?> clazz;
-        /**
-         * The string value is shared
-         */
-        public boolean share;
-        /**
-         * 0: standard 1:percentage 2:RMB
-         * @deprecated Do not use.
-         */
-        @Deprecated
-        public int type;
-        /**
-         * The int value conversion
-         */
-        public IntConversionProcessor processor;
-        /**
-         * The style conversion
-         */
-        public StyleProcessor styleProcessor;
-        /**
-         * The style of cell
-         */
-        public int cellStyle;
-        /**
-         * The style of header
-         */
-        public int headerStyle;
-        /**
-         * The style index of cell, -1 if not be setting
-         */
-        private int cellStyleIndex = -1;
-        /**
-         * The style index of header, -1 if not be setting
-         */
-        private int headerStyleIndex = -1;
-        /**
-         * The cell width
-         */
-        public double width;
-        public int o;
-        public Styles styles;
-        public Comment headerComment, cellComment;
-        /**
-         * Specify the cell number format
-         */
-        public NumFmt numFmt;
-        /**
-         * Only export column name and ignore value
-         */
-        public boolean ignoreValue;
-        /**
-         * Wrap text in a cell
-         */
-        public int wrapText;
-        /**
-         * Specify the column index
-         */
-        public int colIndex = -1;
-
-        /**
-         * Constructor Column
-         */
-        public Column() { }
+    @Deprecated
+    public static class Column extends org.ttzero.excel.entity.Column {
+        public Column() {
+        }
 
-        /**
-         * Constructor Column
-         *
-         * @param name  the column name
-         * @param clazz the cell type
-         */
         public Column(String name, Class<?> clazz) {
-            this(name, clazz, true);
+            super(name, clazz);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name the column name
-         * @param key  field
-         */
         public Column(String name, String key) {
-            this(name, key, true);
+            super(name, key);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name  the column name
-         * @param key   field
-         * @param clazz the cell type
-         */
         public Column(String name, String key, Class<?> clazz) {
-            this(name, key, true);
-            this.clazz = clazz;
+            super(name, key, clazz);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param clazz     the cell type
-         * @param processor The int value conversion
-         */
         public Column(String name, Class<?> clazz, IntConversionProcessor processor) {
-            this(name, clazz, processor, true);
+            super(name, clazz, processor);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param key       field
-         * @param processor The int value conversion
-         */
         public Column(String name, String key, IntConversionProcessor processor) {
-            this(name, key, processor, true);
+            super(name, key, processor);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name  the column name
-         * @param clazz the cell type
-         * @param share true:shared false:inline string
-         */
         public Column(String name, Class<?> clazz, boolean share) {
-            this.name = name;
-            this.clazz = clazz;
-            this.share = share;
+            super(name, clazz, share);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name  the column name
-         * @param key   filed
-         * @param share true:shared false:inline string
-         */
         public Column(String name, String key, boolean share) {
-            this.name = name;
-            this.key = key;
-            this.share = share;
+            super(name, key, share);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param clazz     the cell type
-         * @param processor The int value conversion
-         * @param share     true:shared false:inline string
-         */
         public Column(String name, Class<?> clazz, IntConversionProcessor processor, boolean share) {
-            this(name, clazz, share);
-            this.processor = processor;
+            super(name, clazz, processor, share);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param key       field
-         * @param clazz     type of cell
-         * @param processor The int value conversion
-         */
         public Column(String name, String key, Class<?> clazz, IntConversionProcessor processor) {
-            this(name, key, clazz);
-            this.processor = processor;
+            super(name, key, clazz, processor);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param key       field
-         * @param processor The int value conversion
-         * @param share     true:shared false:inline string
-         */
         public Column(String name, String key, IntConversionProcessor processor, boolean share) {
-            this(name, key, share);
-            this.processor = processor;
+            super(name, key, processor, share);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param clazz     the cell type
-         * @param cellStyle the style of cell
-         */
         public Column(String name, Class<?> clazz, int cellStyle) {
-            this(name, clazz, cellStyle, true);
+            super(name, clazz, cellStyle);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param key       field
-         * @param cellStyle the style of cell
-         */
         public Column(String name, String key, int cellStyle) {
-            this(name, key, cellStyle, true);
+            super(name, key, cellStyle);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param clazz     the cell type
-         * @param cellStyle the style of cell
-         * @param share     true:shared false:inline string
-         */
         public Column(String name, Class<?> clazz, int cellStyle, boolean share) {
-            this(name, clazz, share);
-            this.cellStyle = cellStyle;
+            super(name, clazz, cellStyle, share);
         }
 
-        /**
-         * Constructor Column
-         *
-         * @param name      the column name
-         * @param key       field
-         * @param cellStyle the style of cell
-         * @param share     true:shared false:inline string
-         */
         public Column(String name, String key, int cellStyle, boolean share) {
-            this(name, key, share);
-            this.cellStyle = cellStyle;
-        }
-
-        /**
-         * Setting the cell's width
-         *
-         * @param width the width value
-         * @return the {@link Sheet.Column}
-         */
-        public Column setWidth(double width) {
-            if (width < 0.00000001) {
-                throw new ExcelWriteException("Width " + width + " less than 0.");
-            }
-            this.width = width;
-            return this;
-        }
-
-        /**
-         * Setting the cell is shared
-         *
-         * @return true:shared false:inline string
-         */
-        public boolean isShare() {
-            return share;
+            super(name, key, cellStyle, share);
         }
 
         /**
          * Setting the cell type
          *
          * @param type the cell type
-         * @return the {@link Sheet.Column}
-         * @deprecated Do not use
+         * @return the {@link org.ttzero.excel.entity.Column}
+         * @deprecated replace it with the {{@link #setNumFmt(String)}} method.
          */
         @Deprecated
-        public Column setType(int type) {
-            this.type = type;
-            return this;
-        }
-
-        /**
-         * Returns the column name
-         *
-         * @return the column name
-         */
-        public String getName() {
-            return name;
-        }
-
-        /**
-         * Setting the column name
-         *
-         * @param name the column name
-         * @return the {@link Sheet.Column}
-         */
-        public Column setName(String name) {
-            this.name = name;
-            return this;
-        }
-
-        /**
-         * Returns the cell type
-         *
-         * @return the cell type
-         */
-        public Class<?> getClazz() {
-            return clazz;
-        }
-
-        /**
-         * Setting the cell type
-         *
-         * @param clazz the cell type
-         * @return the {@link Sheet.Column}
-         */
-        public Column setClazz(Class<?> clazz) {
-            this.clazz = clazz;
-            return this;
-        }
-
-        /**
-         * Setting the int value conversion
-         *
-         * @param processor The int value conversion
-         * @return the {@link Sheet.Column}
-         */
-        public Column setProcessor(IntConversionProcessor processor) {
-            this.processor = processor;
-            return this;
-        }
-
-        /**
-         * Setting the style conversion
-         *
-         * @param styleProcessor The style conversion
-         * @return the {@link Sheet.Column}
-         */
-        public Column setStyleProcessor(StyleProcessor styleProcessor) {
-            this.styleProcessor = styleProcessor;
-            return this;
-        }
-
-        /**
-         * Returns the width of cell
-         *
-         * @return the cell width
-         */
-        public double getWidth() {
-            return width;
-        }
-
-        /**
-         * Setting the cell's style
-         *
-         * @param cellStyle the styles value
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(int cellStyle) {
-            this.cellStyle = cellStyle;
-            this.cellStyleIndex = styles.of(cellStyle);
-            return this;
-        }
-
-        /**
-         * Setting the header's style
-         *
-         * @param headerStyle the styles value
-         * @return the {@link Sheet.Column}
-         */
-        public Column setHeaderStyle(int headerStyle) {
-            this.headerStyle = headerStyle;
-            this.headerStyleIndex = styles.of(headerStyle);
-            return this;
-        }
-
-        /**
-         * Settings the x-axis of column in row
-         *
-         * @param colIndex column index (zero base)
-         * @return the {@link Sheet.Column}
-         */
-        public Column setColIndex(int colIndex) {
-            this.colIndex = colIndex;
-            return this;
-        }
-
-        /**
-         * Returns the style index of cell, -1 if not be setting
-         *
-         * @return index of style
-         */
-        public int getCellStyleIndex() {
-            return cellStyleIndex;
-        }
-
-        /**
-         * Returns the header style index of cell, -1 if not be setting
-         *
-         * @return index of style
-         */
-        public int getHeaderStyleIndex() {
-            return headerStyleIndex;
-        }
-
-        /**
-         * Returns the default horizontal style
-         * the Date, Character, Bool has center value, the
-         * Numeric has right value, otherwise left value
-         *
-         * @return the horizontal value
-         */
-        int defaultHorizontal() {
-            int horizontal;
-            if (isDate(clazz) || isDateTime(clazz)
-                || isLocalDate(clazz) || isLocalDateTime(clazz)
-                || isTime(clazz) || isLocalTime(clazz)
-                || isChar(clazz) || isBool(clazz)) {
-                horizontal = Horizontals.CENTER;
-            } else if (isInt(clazz) || isLong(clazz)
-                || isFloat(clazz) || isDouble(clazz)
-                || isBigDecimal(clazz)) {
-                horizontal = Horizontals.RIGHT;
-            } else {
-                horizontal = Horizontals.LEFT;
-            }
-            return horizontal;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @param font the font
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(Font font) {
-            this.cellStyle = styles.of(
-                (font != null ? styles.addFont(font) : 0)
-                    | Verticals.CENTER
-                    | defaultHorizontal());
-            return this;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @param font       the font
-         * @param horizontal the horizontal style
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(Font font, int horizontal) {
-            this.cellStyle = styles.of(
-                (font != null ? styles.addFont(font) : 0)
-                    | Verticals.CENTER
-                    | horizontal);
-            return this;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @param font   the font
-         * @param border the border style
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(Font font, Border border) {
-            this.cellStyle = styles.of(
-                (font != null ? styles.addFont(font) : 0)
-                    | (border != null ? styles.addBorder(border) : 0)
-                    | Verticals.CENTER
-                    | defaultHorizontal());
-            return this;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @param font       the font
-         * @param border     the border style
-         * @param horizontal the horizontal style
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(Font font, Border border, int horizontal) {
-            this.cellStyle = styles.of(
-                (font != null ? styles.addFont(font) : 0)
-                    | (border != null ? styles.addBorder(border) : 0)
-                    | Verticals.CENTER
-                    | horizontal);
-            return this;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @param font   the font
-         * @param fill   the fill style
-         * @param border the border style
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(Font font, Fill fill, Border border) {
-            this.cellStyle = styles.of(
-                (font != null ? styles.addFont(font) : 0)
-                    | (fill != null ? styles.addFill(fill) : 0)
-                    | (border != null ? styles.addBorder(border) : 0)
-                    | Verticals.CENTER
-                    | defaultHorizontal());
-            return this;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @param font       the font
-         * @param fill       the fill style
-         * @param border     the border style
-         * @param horizontal the horizontal style
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(Font font, Fill fill, Border border, int horizontal) {
-            this.cellStyle = styles.of(
-                (font != null ? styles.addFont(font) : 0)
-                    | (fill != null ? styles.addFill(fill) : 0)
-                    | (border != null ? styles.addBorder(border) : 0)
-                    | Verticals.CENTER
-                    | horizontal);
-            return this;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @param font       the font
-         * @param fill       the fill style
-         * @param border     the border style
-         * @param vertical   the vertical style
-         * @param horizontal the horizontal style
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(Font font, Fill fill, Border border, int vertical, int horizontal) {
-            this.cellStyle = styles.of(
-                (font != null ? styles.addFont(font) : 0)
-                    | (fill != null ? styles.addFill(fill) : 0)
-                    | (border != null ? styles.addBorder(border) : 0)
-                    | vertical
-                    | horizontal);
-            return this;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @param numFmt     the number format
-         * @param font       the font
-         * @param fill       the fill style
-         * @param border     the border style
-         * @param vertical   the vertical style
-         * @param horizontal the horizontal style
-         * @return the {@link Sheet.Column}
-         */
-        public Column setCellStyle(NumFmt numFmt, Font font, Fill fill, Border border, int vertical, int horizontal) {
-            this.cellStyle = styles.of(
-                (numFmt != null ? styles.addNumFmt(numFmt) : 0)
-                    | (font != null ? styles.addFont(font) : 0)
-                    | (fill != null ? styles.addFill(fill) : 0)
-                    | (border != null ? styles.addBorder(border) : 0)
-                    | vertical
-                    | horizontal);
-            return this;
-        }
-
-        /**
-         * Setting cell string value is shared
-         * Shared is only valid for strings, and the converted cell type
-         * is also valid for strings.
-         *
-         * @param share true:shared false:inline string
-         * @return the {@link Sheet.Column}
-         */
-        public Column setShare(boolean share) {
-            this.share = share;
-            return this;
-        }
-
-        /**
-         * Setting a cell format of number or date type
-         *
-         * @param code the format string
-         * @return the {@link Sheet.Column}
-         */
-        public Column setNumFmt(String code) {
-            this.numFmt = new NumFmt(code);
-            return this;
-        }
-
-        /**
-         * Returns the column {@link NumFmt}
-         *
-         * @return number format
-         */
-        public NumFmt getNumFmt() {
-            return numFmt != null ? numFmt : styles.getNumFmt(cellStyle);
-        }
-
-        /**
-         * Returns default style based on cell type
-         *
-         * @param clazz the cell type
-         * @return the styles value
-         */
-        public int getCellStyle(Class<?> clazz) {
-            int style;
-            if (isString(clazz)) {
-                style = Styles.defaultStringBorderStyle() | wrapText;
-            } else if (isDateTime(clazz) || isLocalDateTime(clazz)) {
-                style = styles.addNumFmt(new NumFmt("yyyy\\-mm\\-dd\\ hh:mm:ss")) | (1 << INDEX_BORDER) | Horizontals.CENTER;
-            } else if (isDate(clazz) || isLocalDate(clazz)) {
-                style = styles.addNumFmt(new NumFmt("yyyy\\-mm\\-dd")) | (1 << INDEX_BORDER) | Horizontals.CENTER;
-            } else if (isBool(clazz) || isChar(clazz)) {
-                style = Styles.clearHorizontal(Styles.defaultStringBorderStyle()) | Horizontals.CENTER;
-            } else if (isInt(clazz) || isLong(clazz)) {
-                style = Styles.defaultIntBorderStyle();
-                switch (type) {
-                    case Const.ColumnType.NORMAL:
-                        break;
-                    case Const.ColumnType.PARENTAGE:
-                        style = Styles.clearNumFmt(style) | styles.addNumFmt(new NumFmt("0%_);[Red]-0% "));
-                        break;
-                    case Const.ColumnType.RMB:
-                        style = Styles.clearNumFmt(style) | styles.addNumFmt(new NumFmt("¥0_);[Red]-¥0 "));
-                        break;
-                    default:
-                }
-            } else if (isFloat(clazz) || isDouble(clazz) || isBigDecimal(clazz)) {
-                style = Styles.defaultDoubleBorderStyle();
-                switch (type) {
-                    case Const.ColumnType.NORMAL:
-                        break;
-                    case Const.ColumnType.PARENTAGE:
-                        style = Styles.clearNumFmt(style) | styles.addNumFmt(new NumFmt("0.00%_);[Red]-0.00% "));
-                        break;
-                    case Const.ColumnType.RMB:
-                        style = Styles.clearNumFmt(style) | styles.addNumFmt(new NumFmt("¥0.00_);[Red]-¥0.00 "));
-                        break;
-                    default:
-                }
-            } else if (isTime(clazz) || isLocalTime(clazz)) {
-                style =  styles.addNumFmt(new NumFmt("hh:mm:ss")) | (1 << INDEX_BORDER) | Horizontals.CENTER;
-            } else {
-                style = (1 << Styles.INDEX_FONT) | (1 << INDEX_BORDER); // Auto-style
-            }
-
-            // Reset custom number format if specified.
-            if (numFmt != null) {
-                style = Styles.clearNumFmt(style) | styles.addNumFmt(numFmt);
-            }
-
-            return style;
-        }
-
-        /**
-         * Setting the cell styles
-         *
-         * @return the styles value
-         */
-        public int getCellStyle() {
-            if (cellStyleIndex != -1) {
-                return cellStyle;
+        public org.ttzero.excel.entity.Column setType(int type) {
+            switch (type) {
+                case Const.ColumnType.PARENTAGE:
+                    setNumFmt("0.00%_);[Red]-0.00% ");
+                    break;
+                case Const.ColumnType.RMB:
+                    setNumFmt("¥0.00_);[Red]-¥0.00 ");
+                    break;
+                default:
             }
-            setCellStyle(getCellStyle(clazz));
-            return cellStyle;
-        }
-
-        /**
-         * @return bool
-         */
-        public boolean isIgnoreValue() {
-            return ignoreValue;
-        }
-
-        /**
-         * Ignore value
-         */
-        Column ignoreValue() {
-            this.ignoreValue = true;
-            return this;
-        }
-
-        /**
-         * Wrap text in a cell
-         * <p>
-         * Microsoft Excel can wrap text so it appears on multiple lines in a cell.
-         * You can format the cell so the text wraps automatically, or enter a manual line break.
-         *
-         * @param wrapText set wrap
-         * @return the {@link Column} self
-         */
-        public Column setWrapText(boolean wrapText) {
-            this.wrapText = wrapText ? 1 : 0;
             return this;
         }
     }
@@ -1018,7 +393,7 @@ public abstract class Sheet implements Cloneable, Storable {
         this.autoSize = 2;
         this.width = width;
         if (headerReady) {
-            for (Column hc : columns) {
+            for (org.ttzero.excel.entity.Column hc : columns) {
                 hc.setWidth(width);
             }
         }
@@ -1130,15 +505,16 @@ public abstract class Sheet implements Cloneable, Storable {
      * Returns the header column info
      * <p>
      * The copy sheet will use the parent worksheet header information.
+     * <p>
+     * Use the method {@link #getAndSortHeaderColumns()} to get Columns
      *
      * @return array of column
      */
-    public Column[] getHeaderColumns() {
+    protected org.ttzero.excel.entity.Column[] getHeaderColumns() {
         if (!headerReady) {
             if (columns == null) {
-                columns = new Column[0];
+                columns = new org.ttzero.excel.entity.Column[0];
             }
-            headerReady = true;
         }
         return columns;
     }
@@ -1148,9 +524,11 @@ public abstract class Sheet implements Cloneable, Storable {
      *
      * @return header columns
      */
-    public Column[] getAndSortHeaderColumns() {
+    public org.ttzero.excel.entity.Column[] getAndSortHeaderColumns() {
         if (!headerReady) {
-            getHeaderColumns();
+            this.columns = getHeaderColumns();
+            // Reset Common Properties
+            resetCommonProperties(columns);
             // Sort column index
             sortColumns(columns);
             // Turn to one-base
@@ -1162,11 +540,19 @@ public abstract class Sheet implements Cloneable, Storable {
 
             // Check the limit of columns
             checkColumnLimit();
+            headerReady |= (this.columns.length > 0);
         }
         return columns;
     }
 
-    protected void sortColumns(Column[] columns) {
+    protected void resetCommonProperties(org.ttzero.excel.entity.Column[] columns) {
+        for (org.ttzero.excel.entity.Column column : columns) {
+            if (column == null) continue;
+            if (column.styles == null) column.styles = workbook.getStyles();
+        }
+    }
+
+    protected void sortColumns(org.ttzero.excel.entity.Column[] columns) {
         if (columns.length <= 1) return;
         int j = 0;
         for (int i = 0; i < columns.length; i++) {
@@ -1188,14 +574,14 @@ public abstract class Sheet implements Cloneable, Storable {
         }
     }
 
-    protected int search(Column[] columns, int n, int k) {
+    protected int search(org.ttzero.excel.entity.Column[] columns, int n, int k) {
         int i = 0;
         for (; i < n && columns[i].colIndex <= k; i++) ;
         return i;
     }
 
-    private void insert(Column[] columns, int n, int k) {
-        Column t = columns[k];
+    private void insert(org.ttzero.excel.entity.Column[] columns, int n, int k) {
+        org.ttzero.excel.entity.Column t = columns[k];
         System.arraycopy(columns, n, columns, n + 1, k - n);
         columns[n] = t;
     }
@@ -1206,11 +592,8 @@ public abstract class Sheet implements Cloneable, Storable {
      * @param columns the header row's columns
      * @return the {@link Sheet}
      */
-    public Sheet setColumns(final Column[] columns) {
-        this.columns = columns.clone();
-        for (int i = 0; i < columns.length; i++) {
-            columns[i].styles = workbook.getStyles();
-        }
+    public Sheet setColumns(final org.ttzero.excel.entity.Column[] columns) {
+        this.columns = columns;
         return this;
     }
 
@@ -1305,9 +688,6 @@ public abstract class Sheet implements Cloneable, Storable {
         if (sheetWriter == null) {
             throw new ExcelWriteException("Worksheet writer is not instanced.");
         }
-        if (!copySheet) {
-            paging();
-        }
         if (!headerReady) {
             getAndSortHeaderColumns();
         }
@@ -1315,6 +695,10 @@ public abstract class Sheet implements Cloneable, Storable {
             rowBlock = new RowBlock(getRowBlockSize());
         } else rowBlock.reopen();
 
+        if (!copySheet) {
+            paging();
+        }
+
         sheetWriter.writeTo(path);
     }
 
@@ -1501,7 +885,9 @@ public abstract class Sheet implements Cloneable, Storable {
         // clear first
         rowBlock.clear();
 
-        resetBlockData();
+        if (columns.length > 0) {
+            resetBlockData();
+        }
 
         return rowBlock.flip();
     }
@@ -1597,6 +983,20 @@ public abstract class Sheet implements Cloneable, Storable {
             , b = sheetWriter.getColumnLimit();
         if (a > b) {
             throw new TooManyColumnsException(a, b);
+        } else {
+            boolean noneHeader = columns == null || columns.length == 0;
+            if (!noneHeader) {
+                int n = 0;
+                for (org.ttzero.excel.entity.Column column : columns) {
+                    if (isEmpty(column.name)) n++;
+                }
+                noneHeader = n == columns.length;
+            }
+            if (noneHeader) {
+                if (rows > 0) rows--;
+                ignoreHeader();
+            } else this.nonHeader = 0;
+            this.rowLimit = sheetWriter.getRowLimit() - (this.nonHeader ^ 1);
         }
     }
 
@@ -1663,23 +1063,58 @@ public abstract class Sheet implements Cloneable, Storable {
     private static final ThreadLocal<char[][]> cache
         = ThreadLocal.withInitial(() -> new char[][]{ {65}, {65, 65}, {65, 65, 65} });
 
+//    /**
+//     * Check empty header row
+//     *
+//     * @return true if none header row
+//     */
+//    public boolean hasNonHeader() {
+//        int nonHeader = getNonHeader();
+//        if (nonHeader == -1) {
+//            columns = getAndSortHeaderColumns();
+//            boolean noneHeader = columns == null || columns.length == 0;
+//            if (!noneHeader) {
+//                int n = 0;
+//                for (org.ttzero.excel.entity.Column column : columns) {
+//                    if (isEmpty(column.name)) n++;
+//                }
+//                noneHeader = n == columns.length;
+//            }
+//            if (noneHeader) {
+////                rows--;
+//                ignoreHeader();
+//            } else this.nonHeader = 0;
+//            return noneHeader;
+//        }
+//        return nonHeader == 1;
+//    }
+
+    /**
+     * Settings nonHeader property
+     *
+     * @return the Worksheet
+     */
+    public Sheet ignoreHeader() {
+        this.nonHeader = 1;
+        return this;
+    }
+
     /**
-     * Check empty header row
+     * Returns the nonHeader value.
      *
-     * @return true if none header row
-     */
-    public boolean hasNonHeader() {
-        columns = getAndSortHeaderColumns();
-        boolean noneHeader = columns == null || columns.length == 0;
-        if (!noneHeader) {
-            int n = 0;
-            for (Column column : columns) {
-                if (isEmpty(column.name)) n++;
-            }
-            noneHeader = n == columns.length;
-        }
-        if (noneHeader) rows--;
-        return noneHeader;
+     * @return -1, 0, 1 means not-set, include header, exclude header
+     */
+    public int getNonHeader() {
+        return nonHeader;
+    }
+
+    /**
+     * The Worksheet row limit
+     *
+     * @return the limit
+     */
+    protected int getRowLimit() {
+        return rowLimit;
     }
 
     ////////////////////////////Abstract function\\\\\\\\\\\\\\\\\\\\\\\\\\\
@@ -1688,7 +1123,7 @@ public abstract class Sheet implements Cloneable, Storable {
      * Each row-block is multiplexed and will be called to reset
      * the data when a row-block is completely written.
      * Call the {@link #getRowBlockSize()} method to get
-     * the row-block size, call the {@link ICellValueAndStyle#reset(int, Cell, Object, Sheet.Column)}
+     * the row-block size, call the {@link ICellValueAndStyle#reset(int, Cell, Object, org.ttzero.excel.entity.Column)}
      * method to set value and styles.
      */
     protected abstract void resetBlockData();
diff --git a/src/main/java/org/ttzero/excel/entity/StatementSheet.java b/src/main/java/org/ttzero/excel/entity/StatementSheet.java
index db044960..4fd9dc55 100644
--- a/src/main/java/org/ttzero/excel/entity/StatementSheet.java
+++ b/src/main/java/org/ttzero/excel/entity/StatementSheet.java
@@ -64,7 +64,7 @@ public class StatementSheet extends ResultSetSheet {
      * @param name    the worksheet name
      * @param columns the header info
      */
-    public StatementSheet(String name, final Column... columns) {
+    public StatementSheet(String name, final org.ttzero.excel.entity.Column... columns) {
         super(name, columns);
     }
 
@@ -75,7 +75,7 @@ public class StatementSheet extends ResultSetSheet {
      * @param waterMark the water mark
      * @param columns   the header info
      */
-    public StatementSheet(String name, WaterMark waterMark, final Column... columns) {
+    public StatementSheet(String name, WaterMark waterMark, final org.ttzero.excel.entity.Column... columns) {
         super(name, waterMark, columns);
     }
 
@@ -161,7 +161,7 @@ public class StatementSheet extends ResultSetSheet {
      * @param sql     the sql string
      * @param columns the header column
      */
-    public StatementSheet(Connection con, String sql, Sheet.Column... columns) {
+    public StatementSheet(Connection con, String sql, org.ttzero.excel.entity.Column... columns) {
         this(null, con, sql, columns);
     }
 
@@ -173,7 +173,7 @@ public class StatementSheet extends ResultSetSheet {
      * @param sql     the sql string
      * @param columns the header column
      */
-    public StatementSheet(String name, Connection con, String sql, Sheet.Column... columns) {
+    public StatementSheet(String name, Connection con, String sql, org.ttzero.excel.entity.Column... columns) {
         this(name, con, sql, null, columns);
     }
 
@@ -185,7 +185,7 @@ public class StatementSheet extends ResultSetSheet {
      * @param pp      the sql parameter replacement function-interface
      * @param columns the header column
      */
-    public StatementSheet(Connection con, String sql, ParamProcessor pp, Sheet.Column... columns) {
+    public StatementSheet(Connection con, String sql, ParamProcessor pp, org.ttzero.excel.entity.Column... columns) {
         this(null, con, sql, pp, columns);
     }
 
@@ -198,7 +198,7 @@ public class StatementSheet extends ResultSetSheet {
      * @param pp      the sql parameter replacement function-interface
      * @param columns the header column
      */
-    public StatementSheet(String name, Connection con, String sql, ParamProcessor pp, Sheet.Column... columns) {
+    public StatementSheet(String name, Connection con, String sql, ParamProcessor pp, org.ttzero.excel.entity.Column... columns) {
         super(name, columns);
         PreparedStatement ps = null;
         try {
diff --git a/src/main/java/org/ttzero/excel/entity/Tuple2.java b/src/main/java/org/ttzero/excel/entity/Tuple2.java
new file mode 100644
index 00000000..3436eb0e
--- /dev/null
+++ b/src/main/java/org/ttzero/excel/entity/Tuple2.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2017, guanquan.wang@yandex.com 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.entity;
+
+import java.util.Objects;
+
+/**
+ * @author guanquan.wang on 2017/9/26.
+ */
+public final class Tuple2<V1, V2> {
+    public final V1 v1;
+    public final V2 v2;
+
+    public static <V1, V2> Tuple2<V1, V2> of(V1 v1, V2 v2) {
+        return new Tuple2<>(v1, v2);
+    }
+
+    public Tuple2(V1 v1, V2 v2) {
+        this.v1 = v1;
+        this.v2 = v2;
+    }
+
+    public V1 v1() {
+        return v1;
+    }
+
+    public V2 v2() {
+        return v2;
+    }
+
+    public String stringV1() {
+        return v1 != null ? v1.toString() : null;
+    }
+
+    public String stringV2() {
+        return v2 != null ? v2.toString() : null;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof Tuple2)) return false;
+
+        Tuple2 other = (Tuple2) o;
+
+        return Objects.equals(v1, other.v1) && Objects.equals(v2, other.v2);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(v1) ^ Objects.hashCode(v2);
+    }
+
+    @Override
+    public String toString() {
+        return "Tuple2 { v1= " + v1 + ", v2=" + v2 + '}';
+    }
+}
diff --git a/src/main/java/org/ttzero/excel/entity/Workbook.java b/src/main/java/org/ttzero/excel/entity/Workbook.java
index fbfc1d21..3f855c88 100644
--- a/src/main/java/org/ttzero/excel/entity/Workbook.java
+++ b/src/main/java/org/ttzero/excel/entity/Workbook.java
@@ -26,7 +26,6 @@ import org.ttzero.excel.manager.docProps.Core;
 import org.ttzero.excel.processor.ParamProcessor;
 import org.ttzero.excel.processor.Watch;
 import org.ttzero.excel.util.FileUtil;
-import org.ttzero.excel.util.StringUtil;
 
 import javax.naming.OperationNotSupportedException;
 import java.io.File;
@@ -447,7 +446,7 @@ public class Workbook implements Storable {
     }
 
     /**
-     * Add a {@link ListSheet} to the tail with header {@link Sheet.Column} setting.
+     * Add a {@link ListSheet} to the tail with header {@link Column} setting.
      * Also you can use {@code addSheet(new ListSheet&lt;&gt;(data, columns)}
      * to achieve the same effect.
      *
@@ -455,13 +454,13 @@ public class Workbook implements Storable {
      * @param columns the header columns
      * @return the {@link Workbook}
      */
-    public Workbook addSheet(List<?> data, Sheet.Column... columns) {
+    public Workbook addSheet(List<?> data, Column... columns) {
         return addSheet(null, data, columns);
     }
 
     /**
      * Add a {@link ListSheet} to the tail with Worksheet name
-     * and header {@link Sheet.Column} setting. Also you can use
+     * and header {@link Column} setting. Also you can use
      * {@code addSheet(new ListSheet&lt;&gt;(name, data, columns)}
      * to achieve the same effect.
      *
@@ -471,7 +470,7 @@ public class Workbook implements Storable {
      * @return the {@link Workbook}
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public Workbook addSheet(String name, List<?> data, Sheet.Column... columns) {
+    public Workbook addSheet(String name, List<?> data, Column... columns) {
         Object o;
         if (data == null || data.isEmpty() || (o = getFirst(data)) == null) {
             addSheet(new EmptySheet(name, columns));
@@ -499,7 +498,7 @@ public class Workbook implements Storable {
     }
 
     /**
-     * Add a {@link ResultSetSheet} to the tail with header {@link Sheet.Column} setting.
+     * Add a {@link ResultSetSheet} to the tail with header {@link Column} setting.
      * Also you can use {@code addSheet(new ResultSetSheet(rs, columns)}
      * to achieve the same effect.
      *
@@ -507,13 +506,13 @@ public class Workbook implements Storable {
      * @param columns the header columns
      * @return the {@link Workbook}
      */
-    public Workbook addSheet(ResultSet rs, Sheet.Column... columns) {
+    public Workbook addSheet(ResultSet rs, Column... columns) {
         return addSheet(null, rs, columns);
     }
 
     /**
      * Add a {@link ResultSetSheet} to the tail with worksheet name
-     * and header {@link Sheet.Column} setting. Also you can use
+     * and header {@link Column} setting. Also you can use
      * {@code addSheet(new ResultSetSheet(name, rs, columns)}
      *
      * @param name    the worksheet name
@@ -521,7 +520,7 @@ public class Workbook implements Storable {
      * @param columns the header columns
      * @return the {@link Workbook}
      */
-    public Workbook addSheet(String name, ResultSet rs, Sheet.Column... columns) {
+    public Workbook addSheet(String name, ResultSet rs, Column... columns) {
         ResultSetSheet sheet = new ResultSetSheet(name, columns);
         sheet.setRs(rs);
         addSheet(sheet);
@@ -529,7 +528,7 @@ public class Workbook implements Storable {
     }
 
     /**
-     * Add a {@link StatementSheet} to the tail with header {@link Sheet.Column} setting.
+     * Add a {@link StatementSheet} to the tail with header {@link Column} setting.
      * Also you can use {@code addSheet(new StatementSheet(connection, sql, columns)}
      * to achieve the same effect.
      *
@@ -538,13 +537,13 @@ public class Workbook implements Storable {
      * @return the {@link Workbook}
      * @throws SQLException if a database access error occurs
      */
-    public Workbook addSheet(String sql, Sheet.Column... columns) throws SQLException {
+    public Workbook addSheet(String sql, Column... columns) throws SQLException {
         return addSheet(null, sql, columns);
     }
 
     /**
      * Add a {@link StatementSheet} to the tail with worksheet name
-     * and header {@link Sheet.Column} setting. Also you can use
+     * and header {@link Column} setting. Also you can use
      * {@code addSheet(new StatementSheet(name, connection, sql, columns)}
      * to achieve the same effect.
      *
@@ -554,14 +553,14 @@ public class Workbook implements Storable {
      * @return the {@link Workbook}
      * @throws SQLException if a database access error occurs
      */
-    public Workbook addSheet(String name, String sql, Sheet.Column... columns) throws SQLException {
+    public Workbook addSheet(String name, String sql, Column... columns) throws SQLException {
         PreparedStatement ps = con.prepareStatement(sql
             , ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
         return addSheet(name, ps, null, columns);
     }
 
     /**
-     * Add a {@link StatementSheet} to the tail with header {@link Sheet.Column}
+     * Add a {@link StatementSheet} to the tail with header {@link Column}
      * setting. The {@link ParamProcessor} is a sql parameter replacement
      * function-interface to replace "?" in the sql string.
      * <p>
@@ -577,13 +576,13 @@ public class Workbook implements Storable {
      * @return the {@link Workbook}
      * @throws SQLException if a database access error occurs
      */
-    public Workbook addSheet(String sql, ParamProcessor pp, Sheet.Column... columns) throws SQLException {
+    public Workbook addSheet(String sql, ParamProcessor pp, Column... columns) throws SQLException {
         return addSheet(null, sql, pp, columns);
     }
 
     /**
      * Add a {@link StatementSheet} to the tail with worksheet name
-     * and header {@link Sheet.Column} setting. The {@link ParamProcessor}
+     * and header {@link Column} setting. The {@link ParamProcessor}
      * is a sql parameter replacement function-interface to replace "?" in
      * the sql string.
      * <p>
@@ -601,14 +600,14 @@ public class Workbook implements Storable {
      * @throws SQLException if a database access error occurs
      */
     public Workbook addSheet(String name, String sql, ParamProcessor pp
-        , Sheet.Column... columns) throws SQLException {
+        , Column... columns) throws SQLException {
         PreparedStatement ps = con.prepareStatement(sql
             , ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
         return addSheet(name, ps, pp, columns);
     }
 
     /**
-     * Add a {@link StatementSheet} to the tail with header {@link Sheet.Column} setting.
+     * Add a {@link StatementSheet} to the tail with header {@link Column} setting.
      * Also you can use {@code addSheet(new StatementSheet(null, columns).setPs(ps)}
      * to achieve the same effect.
      *
@@ -617,13 +616,13 @@ public class Workbook implements Storable {
      * @return the {@link Workbook}
      * @throws SQLException if a database access error occurs
      */
-    public Workbook addSheet(PreparedStatement ps, Sheet.Column... columns) throws SQLException {
+    public Workbook addSheet(PreparedStatement ps, Column... columns) throws SQLException {
         return addSheet(null, ps, columns);
     }
 
     /**
      * Add a {@link StatementSheet} to the tail with worksheet name
-     * and header {@link Sheet.Column} setting. Also you can use
+     * and header {@link Column} setting. Also you can use
      * {@code addSheet(new StatementSheet(name, columns).setPs(ps)}
      * to achieve the same effect.
      *
@@ -633,12 +632,12 @@ public class Workbook implements Storable {
      * @return the {@link Workbook}
      * @throws SQLException if a database access error occurs
      */
-    public Workbook addSheet(String name, PreparedStatement ps, Sheet.Column... columns) throws SQLException {
+    public Workbook addSheet(String name, PreparedStatement ps, Column... columns) throws SQLException {
         return addSheet(name, ps, null, columns);
     }
 
     /**
-     * Add a {@link StatementSheet} to the tail with header {@link Sheet.Column} setting.
+     * Add a {@link StatementSheet} to the tail with header {@link Column} setting.
      *
      * @param ps      the {@link PreparedStatement}
      * @param pp      the sql parameter replacement function-interface
@@ -646,13 +645,13 @@ public class Workbook implements Storable {
      * @return the {@link Workbook}
      * @throws SQLException if a database access error occurs
      */
-    public Workbook addSheet(PreparedStatement ps, ParamProcessor pp, Sheet.Column... columns) throws SQLException {
+    public Workbook addSheet(PreparedStatement ps, ParamProcessor pp, Column... columns) throws SQLException {
         return addSheet(null, ps, pp, columns);
     }
 
     /**
      * Add a {@link StatementSheet} to the tail with worksheet name
-     * and header {@link Sheet.Column} setting.
+     * and header {@link Column} setting.
      * <blockquote><pre>
      * workbook.addSheet("users", ps, ps -&gt; ps.setString(1, "middle") ...
      * </pre></blockquote>
@@ -664,7 +663,7 @@ public class Workbook implements Storable {
      * @return the {@link Workbook}
      * @throws SQLException if a database access error occurs
      */
-    public Workbook addSheet(String name, PreparedStatement ps, ParamProcessor pp, Sheet.Column... columns) throws SQLException {
+    public Workbook addSheet(String name, PreparedStatement ps, ParamProcessor pp, Column... columns) throws SQLException {
         StatementSheet sheet = new StatementSheet(name, columns);
         try {
             ps.setFetchSize(Integer.MIN_VALUE);
@@ -739,16 +738,13 @@ public class Workbook implements Storable {
 
     /**
      * Return a {@link Sheet} with the specified name
-     * <p>
-     * Note: This method can only return the {@code Sheet} which name specified when created.
      *
      * @param sheetName the sheet name
      * @return the {@link Sheet}, returns null if not found
      */
     public Sheet getSheet(String sheetName) {
-        if (StringUtil.isEmpty(sheetName)) return null;
         for (Sheet sheet : sheets) {
-            if (sheetName.equals(sheet.getName())) {
+            if (sheet.getName().equals(sheetName)) {
                 return sheet;
             }
         }
diff --git a/src/main/java/org/ttzero/excel/entity/csv/CSVCellValueAndStyle.java b/src/main/java/org/ttzero/excel/entity/csv/CSVCellValueAndStyle.java
index af0a29fd..e0f64d81 100644
--- a/src/main/java/org/ttzero/excel/entity/csv/CSVCellValueAndStyle.java
+++ b/src/main/java/org/ttzero/excel/entity/csv/CSVCellValueAndStyle.java
@@ -16,8 +16,8 @@
 
 package org.ttzero.excel.entity.csv;
 
+import org.ttzero.excel.entity.Column;
 import org.ttzero.excel.entity.ICellValueAndStyle;
-import org.ttzero.excel.entity.Sheet;
 import org.ttzero.excel.manager.Const;
 import org.ttzero.excel.reader.Cell;
 import org.ttzero.excel.util.DateUtil;
@@ -54,7 +54,7 @@ public class CSVCellValueAndStyle implements ICellValueAndStyle {
      * @param hc   the header column
      */
     @Override
-    public void reset(int row, Cell cell, Object e, Sheet.Column hc) {
+    public void reset(int row, Cell cell, Object e, Column hc) {
         setCellValue(row, cell, e, hc, hc.getClazz());
     }
 
@@ -77,7 +77,7 @@ public class CSVCellValueAndStyle implements ICellValueAndStyle {
      * @param clazz the cell value type
      */
     @Override
-    public void setCellValue(int row, Cell cell, Object e, Sheet.Column hc, Class<?> clazz) {
+    public void setCellValue(int row, Cell cell, Object e, Column hc, Class<?> clazz) {
         if (e == null) {
             setNullValue(row, cell, hc);
             return;
@@ -132,7 +132,7 @@ public class CSVCellValueAndStyle implements ICellValueAndStyle {
      * @return const zero (general style)
      */
     @Override
-    public int getStyleIndex(int rows, Sheet.Column hc, Object o) {
+    public int getStyleIndex(int rows, Column hc, Object o) {
         return 0;
     }
 }
diff --git a/src/main/java/org/ttzero/excel/entity/csv/CSVWorksheetWriter.java b/src/main/java/org/ttzero/excel/entity/csv/CSVWorksheetWriter.java
index c32e3fdd..c308055a 100644
--- a/src/main/java/org/ttzero/excel/entity/csv/CSVWorksheetWriter.java
+++ b/src/main/java/org/ttzero/excel/entity/csv/CSVWorksheetWriter.java
@@ -16,6 +16,7 @@
 
 package org.ttzero.excel.entity.csv;
 
+import org.ttzero.excel.entity.Column;
 import org.ttzero.excel.entity.ExcelWriteException;
 import org.ttzero.excel.entity.IWorksheetWriter;
 import org.ttzero.excel.entity.Row;
@@ -47,8 +48,8 @@ import static org.ttzero.excel.util.StringUtil.isNotEmpty;
  * @author guanquan.wang at 2019-08-21 22:19
  */
 public class CSVWorksheetWriter implements IWorksheetWriter {
-    private Sheet sheet;
-    private CSVUtil.Writer writer;
+    protected Sheet sheet;
+    protected CSVUtil.Writer writer;
 
     public CSVWorksheetWriter(Sheet sheet) {
         this.sheet = sheet;
@@ -148,11 +149,11 @@ public class CSVWorksheetWriter implements IWorksheetWriter {
      */
     protected void writeBefore() throws IOException {
         // The header columns
-        Sheet.Column[] columns = sheet.getAndSortHeaderColumns();
+        Column[] columns = sheet.getAndSortHeaderColumns();
         boolean noneHeader = columns == null || columns.length == 0;
 
         if (!noneHeader) {
-            for (Sheet.Column hc : columns) {
+            for (Column hc : columns) {
                 writer.write(isNotEmpty(hc.getName()) ? hc.getName() : hc.key);
             }
             writer.newLine();
diff --git a/src/main/java/org/ttzero/excel/entity/e7/XMLCellValueAndStyle.java b/src/main/java/org/ttzero/excel/entity/e7/XMLCellValueAndStyle.java
index 16a5b9bf..faeb3fe0 100644
--- a/src/main/java/org/ttzero/excel/entity/e7/XMLCellValueAndStyle.java
+++ b/src/main/java/org/ttzero/excel/entity/e7/XMLCellValueAndStyle.java
@@ -16,8 +16,8 @@
 
 package org.ttzero.excel.entity.e7;
 
+import org.ttzero.excel.entity.Column;
 import org.ttzero.excel.entity.ICellValueAndStyle;
-import org.ttzero.excel.entity.Sheet;
 import org.ttzero.excel.entity.style.Styles;
 import org.ttzero.excel.manager.Const;
 import org.ttzero.excel.reader.Cell;
@@ -52,7 +52,7 @@ public class XMLCellValueAndStyle implements ICellValueAndStyle {
      * @param hc   the header column
      */
     @Override
-    public void conversion(int row, Cell cell, int n, Sheet.Column hc) {
+    public void conversion(int row, Cell cell, int n, Column hc) {
         Object e = hc.processor.conversion(n);
         if (e != null) {
             Class<?> clazz = e.getClass();
@@ -84,7 +84,7 @@ public class XMLCellValueAndStyle implements ICellValueAndStyle {
      * @param hc   the header column
      */
     @Override
-    public void reset(int row, Cell cell, Object e, Sheet.Column hc) {
+    public void reset(int row, Cell cell, Object e, Column hc) {
         setCellValue(row, cell, e, hc, hc.getClazz());
         if (hc.processor == null) {
             cell.xf = getStyleIndex(row, hc, e);
@@ -99,7 +99,7 @@ public class XMLCellValueAndStyle implements ICellValueAndStyle {
      * @param style the default style
      * @return the style index in xf
      */
-    private int getStyleIndex(int rows, Sheet.Column hc, Object o, int style) {
+    private int getStyleIndex(int rows, Column hc, Object o, int style) {
         // Interlaced discoloration
         if (autoOdd == 0 && isOdd(rows) && !Styles.hasFill(style)) {
             style |= oddFill;
@@ -120,7 +120,7 @@ public class XMLCellValueAndStyle implements ICellValueAndStyle {
      * @return the style index in xf
      */
     @Override
-    public int getStyleIndex(int rows, Sheet.Column hc, Object o) {
+    public int getStyleIndex(int rows, Column hc, Object o) {
         int style = hc.getCellStyle();
         return getStyleIndex(rows, hc, o, style);
     }
diff --git a/src/main/java/org/ttzero/excel/entity/e7/XMLWorksheetWriter.java b/src/main/java/org/ttzero/excel/entity/e7/XMLWorksheetWriter.java
index 47c332bb..8187d883 100644
--- a/src/main/java/org/ttzero/excel/entity/e7/XMLWorksheetWriter.java
+++ b/src/main/java/org/ttzero/excel/entity/e7/XMLWorksheetWriter.java
@@ -17,6 +17,7 @@
 package org.ttzero.excel.entity.e7;
 
 import org.ttzero.excel.annotation.TopNS;
+import org.ttzero.excel.entity.Column;
 import org.ttzero.excel.entity.Comments;
 import org.ttzero.excel.entity.ExcelWriteException;
 import org.ttzero.excel.entity.IWorksheetWriter;
@@ -85,12 +86,13 @@ import static org.ttzero.excel.util.StringUtil.isNotEmpty;
 public class XMLWorksheetWriter implements IWorksheetWriter {
 
     // the storage path
-    private Path workSheetPath;
-    private ExtBufferedWriter bw;
-    private Sheet sheet;
-    private Sheet.Column[] columns;
-    private final SharedStrings sst;
-    private Comments comments;
+    protected Path workSheetPath;
+    protected ExtBufferedWriter bw;
+    protected Sheet sheet;
+    protected Column[] columns;
+    protected final SharedStrings sst;
+    protected Comments comments;
+    protected int startRow;
 
     public XMLWorksheetWriter(Sheet sheet) {
         this.sheet = sheet;
@@ -288,7 +290,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
     protected void writeBefore() throws IOException {
         // The header columns
         columns = sheet.getAndSortHeaderColumns();
-        boolean noneHeader = sheet.hasNonHeader();
+        boolean nonHeader = sheet.getNonHeader() == 1;
 
         bw.write(Const.EXCEL_XML_DECLARATION);
         // Declaration
@@ -343,7 +345,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
         // Default row height and width
         n = 6;
         bw.write("<sheetFormatPr defaultRowHeight=\"15.5\" defaultColWidth=\"");
-        BigDecimal width = BigDecimal.valueOf(!noneHeader ? sheet.getDefaultWidth() : 8.38);
+        BigDecimal width = BigDecimal.valueOf(!nonHeader ? sheet.getDefaultWidth() : 8.38);
         String stringWidth = width.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
         n -= stringWidth.length();
         bw.write(stringWidth);
@@ -354,15 +356,27 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
         // cols
         if (columns.length > 0) {
             bw.write("<cols>");
-            for (int i = 0; i < columns.length; i++) {
+            if (sheet.isAutoSize()) {
+                for (int i = 0; i < columns.length; i++) {
+                    bw.write("<col customWidth=\"1\" width=\"");
+                    bw.write(stringWidth);
+                    bw.write('"');
+                    for (int j = n; j-- > 0; ) bw.write(32); // Fill space
+                    bw.write(" min=\"");
+                    bw.writeInt(columns[i].colIndex);
+                    bw.write("\" max=\"");
+                    bw.writeInt(columns[i].colIndex + 1);
+                    bw.write("\" bestFit=\"1\"/>");
+                }
+            } else {
                 bw.write("<col customWidth=\"1\" width=\"");
                 bw.write(stringWidth);
                 bw.write('"');
                 for (int j = n; j-- > 0; ) bw.write(32); // Fill space
-                bw.write(" max=\"");
-                bw.writeInt(columns[i].colIndex + 1);
-                bw.write("\" min=\"");
-                bw.writeInt(columns[i].colIndex);
+                bw.write(" min=\"");
+                bw.writeInt(columns[0].colIndex);
+                bw.write("\" max=\"");
+                bw.writeInt(columns[columns.length - 1].colIndex + 1);
                 bw.write("\" bestFit=\"1\"/>");
             }
             bw.write("</cols>");
@@ -371,9 +385,10 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
         // Write body data
         bw.write("<sheetData>");
 
-        if (!noneHeader) {
+        if (!nonHeader) {
             writeHeaderRow();
         }
+        startRow = 1 + (sheet.getNonHeader() ^ 1);
     }
 
     /**
@@ -393,17 +408,17 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
         int c = 0, defaultStyleIndex = sheet.defaultHeadStyleIndex();
 
         if (sheet.isAutoSize()) {
-            for (Sheet.Column hc : columns) {
+            for (Column hc : columns) {
                 writeStringAutoSize(isNotEmpty(hc.getName()) ? hc.getName() : hc.key, row, c++, hc.getHeaderStyleIndex() == -1 ? defaultStyleIndex : hc.getHeaderStyleIndex());
             }
         } else {
-            for (Sheet.Column hc : columns) {
+            for (Column hc : columns) {
                 writeString(isNotEmpty(hc.getName()) ? hc.getName() : hc.key, row, c++, hc.getHeaderStyleIndex() == -1 ? defaultStyleIndex : hc.getHeaderStyleIndex());
             }
         }
 
         // Write header comments
-        for (Sheet.Column hc : columns) {
+        for (Column hc : columns) {
             if (hc.headerComment != null) {
                 if (comments == null) comments = sheet.createComments();
                 comments.addComment(new String(int2Col(hc.colIndex)) + row
@@ -480,7 +495,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
      */
     protected int startRow(int rows, int columns) throws IOException {
         // Row number
-        int r = rows + 2;
+        int r = rows + startRow;
         // logging
         if (r % 1_0000 == 0) {
             sheet.what("0014", String.valueOf(r));
@@ -607,7 +622,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
             throw new ExcelWriteException("Characters per cell out of limit. size=" + s.length()
                 + ", limit=" + Const.Limit.MAX_CHARACTERS_PER_CELL);
         }
-        Sheet.Column hc = columns[column];
+        Column hc = columns[column];
         bw.write("<c r=\"");
         bw.write(int2Col(hc.colIndex));
         bw.writeInt(row);
@@ -643,7 +658,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
      */
     protected void writeStringAutoSize(String s, int row, int column, int xf) throws IOException {
         writeString(s, row, column, xf);
-        Sheet.Column hc = columns[column];
+        Column hc = columns[column];
         int ln; // TODO get charset base on font style
         if (hc.width == 0 && hc.o < (ln = s.getBytes(StandardCharsets.UTF_8).length)) {
             hc.o = ln;
@@ -681,7 +696,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
      */
     protected void writeDoubleAutoSize(double d, int row, int column, int xf) throws IOException {
         writeDouble(d, row, column, xf);
-        Sheet.Column hc = columns[column];
+        Column hc = columns[column];
         int n;
         if (hc.width == 0 && hc.o < (n = Double.toString(d).length())) {
             hc.o = n;
@@ -719,7 +734,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
      */
     protected void writeDecimalAutoSize(BigDecimal bd, int row, int column, int xf) throws IOException {
         writeDecimal(bd, row, column, xf);
-        Sheet.Column hc = columns[column];
+        Column hc = columns[column];
         int l;
         if (hc.width == 0 && hc.o < (l = bd.toString().length())) {
             hc.o = l;
@@ -777,7 +792,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
      */
     protected void writeNumericAutoSize(long l, int row, int column, int xf) throws IOException {
         writeNumeric(l, row, column, xf);
-        Sheet.Column hc = columns[column];
+        Column hc = columns[column];
         int n;
         if (hc.width == 0 && hc.o < (n = (l < 0L ? stringSize(-l) + 1 : stringSize(l)))) {
             hc.o = n;
@@ -834,7 +849,7 @@ public class XMLWorksheetWriter implements IWorksheetWriter {
         String[] widths = new String[columns.length];
         // Collect column width
         for (int i = 0; i < columns.length; i++) {
-            Sheet.Column hc = columns[i];
+            Column hc = columns[i];
             double width = hc.width;
                 // Fix width
             if (width < 0.0000001) {
diff --git a/src/main/java/org/ttzero/excel/manager/docProps/App.java b/src/main/java/org/ttzero/excel/manager/docProps/App.java
index f6cf00bd..741ec090 100644
--- a/src/main/java/org/ttzero/excel/manager/docProps/App.java
+++ b/src/main/java/org/ttzero/excel/manager/docProps/App.java
@@ -20,7 +20,7 @@ package org.ttzero.excel.manager.docProps;
 import org.ttzero.excel.annotation.Attr;
 import org.ttzero.excel.annotation.NS;
 import org.ttzero.excel.annotation.TopNS;
-import org.ttzero.excel.entity.NameValue;
+import org.ttzero.excel.entity.Tuple2;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -60,15 +60,15 @@ public class App extends XmlEntity {
             this.vector = vector;
             headingPairs = new HeadingPairs();
             headingPairs.vector = new ArrayList<>();
-            headingPairs.vector.add(new NameValue("lpstr", "Workbook"));
-            headingPairs.vector.add(new NameValue("i4", String.valueOf(vector.size())));
+            headingPairs.vector.add(new Tuple2<>("lpstr", "Workbook"));
+            headingPairs.vector.add(new Tuple2<>("i4", String.valueOf(vector.size())));
         }
     }
 
     private static class HeadingPairs {
         @NS(value = "vt", contentUse = true)
         @Attr(name = {"baseType", "size"}, value = {"variant", "#size#"})
-        List<NameValue> vector;
+        List<Tuple2<String, String>> vector;
     }
 
     public void setTitlePards(List<String> list) {
diff --git a/src/main/java/org/ttzero/excel/manager/docProps/XmlEntity.java b/src/main/java/org/ttzero/excel/manager/docProps/XmlEntity.java
index 1a5890ed..d2dbbde3 100644
--- a/src/main/java/org/ttzero/excel/manager/docProps/XmlEntity.java
+++ b/src/main/java/org/ttzero/excel/manager/docProps/XmlEntity.java
@@ -25,7 +25,7 @@ import org.ttzero.excel.annotation.Attr;
 import org.ttzero.excel.annotation.NS;
 import org.ttzero.excel.annotation.TopNS;
 import org.ttzero.excel.entity.ExcelWriteException;
-import org.ttzero.excel.entity.NameValue;
+import org.ttzero.excel.entity.Tuple2;
 import org.ttzero.excel.entity.Storable;
 import org.ttzero.excel.util.DateUtil;
 import org.ttzero.excel.util.FileUtil;
@@ -257,9 +257,9 @@ class XmlEntity implements Storable {
         StringBuilder buf = new StringBuilder();
         for (Iterator<?> it = collection.iterator(); it.hasNext(); ) {
             Object node = it.next();
-            if (node instanceof NameValue) {
-                NameValue nv = (NameValue) node;
-                element.addElement(nv.getName()).setText(nv.getValue());
+            if (node instanceof Tuple2) {
+                Tuple2 nv = (Tuple2) node;
+                element.addElement(nv.stringV1()).setText(nv.stringV2());
             } else {
 //                element.addElement(String.valueOf(++idx)).setText(node.toString());
                 buf.append(node).append(',');
@@ -275,10 +275,10 @@ class XmlEntity implements Storable {
         if (namespace != null) {
             for (Iterator<?> it = collection.iterator(); it.hasNext(); ) {
                 Object node = it.next();
-                if (node instanceof NameValue) {
-                    NameValue nv = (NameValue) node;
+                if (node instanceof Tuple2) {
+                    Tuple2 nv = (Tuple2) node;
                     element.addElement(QName.get(baseType, namespace))
-                        .addElement(QName.get(nv.getName(), namespace)).setText(nv.getValue());
+                        .addElement(QName.get(nv.stringV1(), namespace)).setText(nv.stringV2());
                 } else {
                     element.addElement(QName.get(baseType, namespace)).setText(node.toString());
                 }
@@ -286,9 +286,9 @@ class XmlEntity implements Storable {
         } else {
             for (Iterator<?> it = collection.iterator(); it.hasNext(); ) {
                 Object node = it.next();
-                if (node instanceof NameValue) {
-                    NameValue nv = (NameValue) node;
-                    element.addElement(baseType).addElement(nv.getName()).setText(nv.getValue());
+                if (node instanceof Tuple2) {
+                    Tuple2 nv = (Tuple2) node;
+                    element.addElement(baseType).addElement(nv.stringV1()).setText(nv.stringV2());
                 } else {
                     element.addElement(baseType).setText(node.toString());
                 }


Test patch:
diff --git a/src/test/java/org/ttzero/excel/entity/CustomerNumFmtTest.java b/src/test/java/org/ttzero/excel/entity/CustomerNumFmtTest.java
index 44055bcd..98933c49 100644
--- a/src/test/java/org/ttzero/excel/entity/CustomerNumFmtTest.java
+++ b/src/test/java/org/ttzero/excel/entity/CustomerNumFmtTest.java
@@ -24,9 +24,9 @@ public class CustomerNumFmtTest extends WorkbookTest {
         new Workbook("customize_data_format")
                 .setAutoSize(true)
                 .addSheet(new ListSheet<>(ItemFull.randomFull()
-                , new Sheet.Column("编码", "code")
-                , new Sheet.Column("姓名", "name")
-                , new Sheet.Column("日期", "date").setNumFmt("yyyy年mm月dd日 hh日mm分")
+                , new Column("编码", "code")
+                , new Column("姓名", "name")
+                , new Column("日期", "date").setNumFmt("yyyy年mm月dd日 hh日mm分")
         )).writeTo(defaultTestPath);
     }
 
@@ -34,10 +34,10 @@ public class CustomerNumFmtTest extends WorkbookTest {
         new Workbook("customize_numfmt_full")
                 .setAutoSize(true)
                 .addSheet(new ListSheet<>(ItemFull.randomFull()
-                        , new Sheet.Column("编码", "code")
-                        , new Sheet.Column("姓名", "name")
-                        , new Sheet.Column("日期", "date").setNumFmt("上午/下午hh\"時\"mm\"分\"")
-                        , new Sheet.Column("数字", "num").setNumFmt("#,##0 ;[Red]-#,##0 ")
+                        , new Column("编码", "code")
+                        , new Column("姓名", "name")
+                        , new Column("日期", "date").setNumFmt("上午/下午hh\"時\"mm\"分\"")
+                        , new Column("数字", "num").setNumFmt("#,##0 ;[Red]-#,##0 ")
                 )).writeTo(defaultTestPath);
     }
 
diff --git a/src/test/java/org/ttzero/excel/entity/EmptySheetTest.java b/src/test/java/org/ttzero/excel/entity/EmptySheetTest.java
index 4e6617b1..17b8e4ed 100644
--- a/src/test/java/org/ttzero/excel/entity/EmptySheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/EmptySheetTest.java
@@ -41,9 +41,9 @@ public class EmptySheetTest extends WorkbookTest {
         new Workbook("test empty header", author)
             .watch(Print::println)
             .addSheet(new EmptySheet("Empty"
-                , new Sheet.Column("ID", Integer.class)
-                , new Sheet.Column("NAME", String.class)
-                , new Sheet.Column("AGE", Integer.class)
+                , new Column("ID", Integer.class)
+                , new Column("NAME", String.class)
+                , new Column("AGE", Integer.class)
             ))
             .writeTo(defaultTestPath);
     }
diff --git a/src/test/java/org/ttzero/excel/entity/ListMapSheetTest.java b/src/test/java/org/ttzero/excel/entity/ListMapSheetTest.java
index b74de2ee..f5dafa76 100644
--- a/src/test/java/org/ttzero/excel/entity/ListMapSheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/ListMapSheetTest.java
@@ -60,21 +60,21 @@ public class ListMapSheetTest extends WorkbookTest {
         new Workbook("test header column map", author)
             .watch(Print::println)
             .addSheet(createAllTypeData()
-                , new Sheet.Column("boolean", "bv", boolean.class)
-                , new Sheet.Column("char", "cv", char.class)
-                , new Sheet.Column("short", "sv", short.class)
-                , new Sheet.Column("int", "nv", int.class)
-                , new Sheet.Column("long", "lv", long.class)
-                , new Sheet.Column("float", "fv", float.class)
-                , new Sheet.Column("double", "dv", double.class)
-                , new Sheet.Column("string", "s", String.class)
-                , new Sheet.Column("decimal", "mv", BigDecimal.class)
-                , new Sheet.Column("date", "av", Date.class)
-                , new Sheet.Column("timestamp", "iv", Timestamp.class)
-                , new Sheet.Column("time", "tv", Time.class)
-                , new Sheet.Column("LocalDate", "ldv", LocalDate.class)
-                , new Sheet.Column("LocalDateTime", "ldtv", LocalDateTime.class)
-                , new Sheet.Column("LocalTime", "ltv", LocalTime.class)
+                , new Column("boolean", "bv", boolean.class)
+                , new Column("char", "cv", char.class)
+                , new Column("short", "sv", short.class)
+                , new Column("int", "nv", int.class)
+                , new Column("long", "lv", long.class)
+                , new Column("float", "fv", float.class)
+                , new Column("double", "dv", double.class)
+                , new Column("string", "s", String.class)
+                , new Column("decimal", "mv", BigDecimal.class)
+                , new Column("date", "av", Date.class)
+                , new Column("timestamp", "iv", Timestamp.class)
+                , new Column("time", "tv", Time.class)
+                , new Column("LocalDate", "ldv", LocalDate.class)
+                , new Column("LocalDateTime", "ldtv", LocalDateTime.class)
+                , new Column("LocalTime", "ltv", LocalTime.class)
             )
             .writeTo(defaultTestPath);
     }
@@ -83,12 +83,12 @@ public class ListMapSheetTest extends WorkbookTest {
         new Workbook("test header column box type map", author)
             .watch(Print::println)
             .addSheet(createAllTypeData()
-                , new Sheet.Column("Character", "cv", Character.class)
-                , new Sheet.Column("Short", "sv", Short.class)
-                , new Sheet.Column("Integer", "nv", Integer.class)
-                , new Sheet.Column("Long", "lv", Long.class)
-                , new Sheet.Column("Float", "fv", Float.class)
-                , new Sheet.Column("Double", "dv", Double.class)
+                , new Column("Character", "cv", Character.class)
+                , new Column("Short", "sv", Short.class)
+                , new Column("Integer", "nv", Integer.class)
+                , new Column("Long", "lv", Long.class)
+                , new Column("Float", "fv", Float.class)
+                , new Column("Double", "dv", Double.class)
             )
             .writeTo(defaultTestPath);
     }
@@ -114,21 +114,21 @@ public class ListMapSheetTest extends WorkbookTest {
             .watch(Print::println)
             .setAutoSize(true)
             .addSheet(new ListMapSheet("Map"
-                , new Sheet.Column("boolean", "bv", boolean.class)
-                , new Sheet.Column("char", "cv", char.class)
-                , new Sheet.Column("short", "sv", short.class)
-                , new Sheet.Column("int", "nv", int.class)
-                , new Sheet.Column("long", "lv", long.class)
-                , new Sheet.Column("float", "fv", float.class)
-                , new Sheet.Column("double", "dv", double.class)
-                , new Sheet.Column("string", "s", String.class)
-                , new Sheet.Column("decimal", "mv", BigDecimal.class)
-                , new Sheet.Column("date", "av", Date.class)
-                , new Sheet.Column("timestamp", "iv", Timestamp.class)
-                , new Sheet.Column("time", "tv", Time.class)
-                , new Sheet.Column("LocalDate", "ldv", LocalDate.class)
-                , new Sheet.Column("LocalDateTime", "ldtv", LocalDateTime.class)
-                , new Sheet.Column("LocalTime", "ltv", LocalTime.class)
+                , new Column("boolean", "bv", boolean.class)
+                , new Column("char", "cv", char.class)
+                , new Column("short", "sv", short.class)
+                , new Column("int", "nv", int.class)
+                , new Column("long", "lv", long.class)
+                , new Column("float", "fv", float.class)
+                , new Column("double", "dv", double.class)
+                , new Column("string", "s", String.class)
+                , new Column("decimal", "mv", BigDecimal.class)
+                , new Column("date", "av", Date.class)
+                , new Column("timestamp", "iv", Timestamp.class)
+                , new Column("time", "tv", Time.class)
+                , new Column("LocalDate", "ldv", LocalDate.class)
+                , new Column("LocalDateTime", "ldtv", LocalDateTime.class)
+                , new Column("LocalTime", "ltv", LocalTime.class)
             )
                 .setData(createAllTypeData(10)))
             .writeTo(defaultTestPath);
@@ -139,21 +139,21 @@ public class ListMapSheetTest extends WorkbookTest {
             .watch(Print::println)
             .setAutoSize(true)
             .addSheet(new ListMapSheet("Map", WaterMark.of(author)
-                , new Sheet.Column("boolean", "bv", boolean.class)
-                , new Sheet.Column("char", "cv", char.class)
-                , new Sheet.Column("short", "sv", short.class)
-                , new Sheet.Column("int", "nv", int.class)
-                , new Sheet.Column("long", "lv", long.class)
-                , new Sheet.Column("float", "fv", float.class)
-                , new Sheet.Column("double", "dv", double.class)
-                , new Sheet.Column("string", "s", String.class)
-                , new Sheet.Column("decimal", "mv", BigDecimal.class)
-                , new Sheet.Column("date", "av", Date.class)
-                , new Sheet.Column("timestamp", "iv", Timestamp.class)
-                , new Sheet.Column("time", "tv", Time.class)
-                , new Sheet.Column("LocalDate", "ldv", LocalDate.class)
-                , new Sheet.Column("LocalDateTime", "ldtv", LocalDateTime.class)
-                , new Sheet.Column("LocalTime", "ltv", LocalTime.class))
+                , new Column("boolean", "bv", boolean.class)
+                , new Column("char", "cv", char.class)
+                , new Column("short", "sv", short.class)
+                , new Column("int", "nv", int.class)
+                , new Column("long", "lv", long.class)
+                , new Column("float", "fv", float.class)
+                , new Column("double", "dv", double.class)
+                , new Column("string", "s", String.class)
+                , new Column("decimal", "mv", BigDecimal.class)
+                , new Column("date", "av", Date.class)
+                , new Column("timestamp", "iv", Timestamp.class)
+                , new Column("time", "tv", Time.class)
+                , new Column("LocalDate", "ldv", LocalDate.class)
+                , new Column("LocalDateTime", "ldtv", LocalDateTime.class)
+                , new Column("LocalTime", "ltv", LocalTime.class))
                 .setData(createAllTypeData(10)))
             .writeTo(defaultTestPath);
     }
@@ -179,12 +179,12 @@ public class ListMapSheetTest extends WorkbookTest {
             .watch(Print::println)
             .setAutoSize(true)
             .addSheet(new ListMapSheet(createAllTypeData(10)
-                , new Sheet.Column("Character", "cv", Character.class)
-                , new Sheet.Column("Short", "sv", Short.class)
-                , new Sheet.Column("Integer", "nv", Integer.class)
-                , new Sheet.Column("Long", "lv", Long.class)
-                , new Sheet.Column("Float", "fv", Float.class)
-                , new Sheet.Column("Double", "dv", Double.class)))
+                , new Column("Character", "cv", Character.class)
+                , new Column("Short", "sv", Short.class)
+                , new Column("Integer", "nv", Integer.class)
+                , new Column("Long", "lv", Long.class)
+                , new Column("Float", "fv", Float.class)
+                , new Column("Double", "dv", Double.class)))
             .writeTo(defaultTestPath);
     }
 
@@ -193,8 +193,8 @@ public class ListMapSheetTest extends WorkbookTest {
             .watch(Print::println)
             .setAutoSize(true)
             .addSheet(new ListMapSheet("MAP", createTestData(10)
-                , new Sheet.Column("ID", "id", int.class)
-                , new Sheet.Column("NAME", "name", String.class)))
+                , new Column("ID", "id", int.class)
+                , new Column("NAME", "name", String.class)))
             .writeTo(defaultTestPath);
     }
 
@@ -204,8 +204,8 @@ public class ListMapSheetTest extends WorkbookTest {
             .setAutoSize(true)
             .addSheet(new ListMapSheet(createTestData(10)
                 , WaterMark.of(author)
-                , new Sheet.Column("ID", "id")
-                , new Sheet.Column("NAME", "name")))
+                , new Column("ID", "id")
+                , new Column("NAME", "name")))
             .writeTo(defaultTestPath);
     }
 
@@ -216,8 +216,8 @@ public class ListMapSheetTest extends WorkbookTest {
             .addSheet(new ListMapSheet("MAP"
                 , createTestData(10)
                 , WaterMark.of(author)
-                , new Sheet.Column("ID", "id", int.class)
-                , new Sheet.Column("NAME", "name", String.class)))
+                , new Column("ID", "id", int.class)
+                , new Column("NAME", "name", String.class)))
             .writeTo(defaultTestPath);
     }
 
@@ -298,8 +298,8 @@ public class ListMapSheetTest extends WorkbookTest {
     @Test public void testWrapText() throws IOException {
         new Workbook("MAP WRAP TEXT", author)
                 .addSheet(createTestData(10)
-                    , new Sheet.Column("ID", "id", int.class)
-                    , new Sheet.Column("NAME", "name", String.class).setWrapText(true)
+                    , new Column("ID", "id", int.class)
+                    , new Column("NAME", "name", String.class).setWrapText(true)
                 )
                 .writeTo(defaultTestPath);
     }
@@ -310,8 +310,8 @@ public class ListMapSheetTest extends WorkbookTest {
                     .watch(Print::println)
                     .setAutoSize(true)
                     .addSheet(new ListMapSheet("MAP", createTestData(10)
-                            , new Sheet.Column("ID", "id", int.class).setColIndex(9999999)
-                            , new Sheet.Column("NAME", "name", String.class)))
+                            , new Column("ID", "id", int.class).setColIndex(9999999)
+                            , new Column("NAME", "name", String.class)))
                     .writeTo(defaultTestPath);
             assert false;
         } catch (TooManyColumnsException e) {
diff --git a/src/test/java/org/ttzero/excel/entity/ListObjectSheetTest.java b/src/test/java/org/ttzero/excel/entity/ListObjectSheetTest.java
index 81703077..09f0a613 100644
--- a/src/test/java/org/ttzero/excel/entity/ListObjectSheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/ListObjectSheetTest.java
@@ -125,9 +125,9 @@ public class ListObjectSheetTest extends WorkbookTest {
         new Workbook("test int conversion", author)
             .watch(Print::println)
             .addSheet(Student.randomTestData()
-                , new Sheet.Column("学号", "id")
-                , new Sheet.Column("姓名", "name")
-                , new Sheet.Column("成绩", "score", n -> n < 60 ? "不及格" : n)
+                , new Column("学号", "id")
+                , new Column("姓名", "name")
+                , new Column("成绩", "score", n -> n < 60 ? "不及格" : n)
             )
             .writeTo(defaultTestPath);
     }
@@ -136,9 +136,9 @@ public class ListObjectSheetTest extends WorkbookTest {
         new Workbook("object style processor", author)
             .watch(Print::println)
             .addSheet(Student.randomTestData()
-                , new Sheet.Column("学号", "id")
-                , new Sheet.Column("姓名", "name")
-                , new Sheet.Column("成绩", "score")
+                , new Column("学号", "id")
+                , new Column("姓名", "name")
+                , new Column("成绩", "score")
                     .setStyleProcessor((o, style, sst) -> {
                         if ((int)o < 60) {
                             style = Styles.clearFill(style)
@@ -154,9 +154,9 @@ public class ListObjectSheetTest extends WorkbookTest {
         new Workbook("object style and style processor", author)
             .watch(Print::println)
             .addSheet(Student.randomTestData()
-                , new Sheet.Column("学号", "id")
-                , new Sheet.Column("姓名", "name")
-                , new Sheet.Column("成绩", "score", n -> n < 60 ? "不及格" : n)
+                , new Column("学号", "id")
+                , new Column("姓名", "name")
+                , new Column("成绩", "score", n -> n < 60 ? "不及格" : n)
                     .setStyleProcessor((o, style, sst) -> {
                         if ((int)o < 60) {
                             style = Styles.clearFill(style)
@@ -221,8 +221,8 @@ public class ListObjectSheetTest extends WorkbookTest {
             .watch(Print::println)
             .setAutoSize(true)
             .addSheet(new ListSheet<Item>("Item"
-                , new Sheet.Column("ID", "id")
-                , new Sheet.Column("NAME", "name"))
+                , new Column("ID", "id")
+                , new Column("NAME", "name"))
                 .setData(Item.randomTestData(10)))
             .writeTo(defaultTestPath);
     }
@@ -232,8 +232,8 @@ public class ListObjectSheetTest extends WorkbookTest {
             .watch(Print::println)
             .setAutoSize(true)
             .addSheet(new ListSheet<Item>("Item", WaterMark.of(author)
-                , new Sheet.Column("ID", "id")
-                , new Sheet.Column("NAME", "name"))
+                , new Column("ID", "id")
+                , new Column("NAME", "name"))
                 .setData(Item.randomTestData(10)))
             .writeTo(defaultTestPath);
     }
@@ -259,8 +259,8 @@ public class ListObjectSheetTest extends WorkbookTest {
             .watch(Print::println)
             .setAutoSize(true)
             .addSheet(new ListSheet<>(Item.randomTestData(10)
-                , new Sheet.Column("ID", "id")
-                , new Sheet.Column("NAME", "name")))
+                , new Column("ID", "id")
+                , new Column("NAME", "name")))
             .writeTo(defaultTestPath);
     }
 
@@ -269,8 +269,8 @@ public class ListObjectSheetTest extends WorkbookTest {
             .watch(Print::println)
             .setAutoSize(true)
             .addSheet(new ListSheet<>("ITEM", Item.randomTestData(10)
-                , new Sheet.Column("ID", "id")
-                , new Sheet.Column("NAME", "name")))
+                , new Column("ID", "id")
+                , new Column("NAME", "name")))
             .writeTo(defaultTestPath);
     }
 
@@ -280,8 +280,8 @@ public class ListObjectSheetTest extends WorkbookTest {
             .setAutoSize(true)
             .addSheet(new ListSheet<>(Item.randomTestData(10)
                 , WaterMark.of(author)
-                , new Sheet.Column("ID", "id")
-                , new Sheet.Column("NAME", "name")))
+                , new Column("ID", "id")
+                , new Column("NAME", "name")))
             .writeTo(defaultTestPath);
     }
 
@@ -292,8 +292,8 @@ public class ListObjectSheetTest extends WorkbookTest {
             .addSheet(new ListSheet<>("ITEM"
                 , Item.randomTestData(10)
                 , WaterMark.of(author)
-                , new Sheet.Column("ID", "id")
-                , new Sheet.Column("NAME", "name")))
+                , new Column("ID", "id")
+                , new Column("NAME", "name")))
             .writeTo(defaultTestPath);
     }
 
@@ -328,9 +328,9 @@ public class ListObjectSheetTest extends WorkbookTest {
     public void testStyleConversion1() throws IOException {
         new Workbook("object style processor1", "guanquan.wang")
             .addSheet(new ListSheet<>("期末成绩", Student.randomTestData()
-                    , new Sheet.Column("学号", "id")
-                    , new Sheet.Column("姓名", "name")
-                    , new Sheet.Column("成绩", "score", conversion)
+                    , new Column("学号", "id")
+                    , new Column("姓名", "name")
+                    , new Column("成绩", "score", conversion)
                     .setStyleProcessor(sp)
                 )
             )
@@ -363,9 +363,9 @@ public class ListObjectSheetTest extends WorkbookTest {
     @Test public void testFieldUnDeclare() throws IOException {
         new Workbook("field un-declare", author)
             .addSheet(new ListSheet<>("期末成绩", Student.randomTestData()
-                    , new Sheet.Column("学号", "id")
-                    , new Sheet.Column("姓名", "name")
-                    , new Sheet.Column("成绩", "sore") // un-declare field
+                    , new Column("学号", "id")
+                    , new Column("姓名", "name")
+                    , new Column("成绩", "score") // un-declare field
                 )
             )
             .writeTo(defaultTestPath);
@@ -636,12 +636,31 @@ public class ListObjectSheetTest extends WorkbookTest {
     @Test public void testOrderColumnSpecifyOnColumn() throws IOException {
         new Workbook("Order column 2")
             .addSheet(new ListSheet<>("期末成绩", Student.randomTestData()
-                , new Sheet.Column("学号", "id").setColIndex(3)
-                , new Sheet.Column("姓名", "name")
-                , new Sheet.Column("成绩", "sore").setColIndex(5) // un-declare field
+                , new Column("学号", "id").setColIndex(3)
+                , new Column("姓名", "name")
+                , new Column("成绩", "score").setColIndex(5) // un-declare field
             )).writeTo(defaultTestPath);
     }
 
+    @Test public void testBasicType() throws IOException {
+        List<Integer> list = new ArrayList<>();
+        for (int i = 0; i < 35; i++) list.add(i);
+        new Workbook("Integer array").addSheet(new ListSheet<Integer>(list) {
+            @Override
+            public org.ttzero.excel.entity.Column[] getHeaderColumns() {
+                return new org.ttzero.excel.entity.Column[]{ new ListSheet.EntryColumn().setClazz(Integer.class) };
+            }
+        }.ignoreHeader()).writeTo(defaultTestPath);
+
+        try (ExcelReader reader = ExcelReader.read(defaultTestPath.resolve("Integer array.xlsx"))) {
+            Integer[] array = reader.sheets().flatMap(org.ttzero.excel.reader.Sheet::rows).map(row -> row.getInt(0)).toArray(Integer[]::new);
+            assert array.length == list.size();
+            for (int i = 0; i < array.length; i++) {
+                assert array[i].equals(list.get(i));
+            }
+        }
+    }
+
     public static class Item {
         @ExcelColumn
         private int id;
diff --git a/src/test/java/org/ttzero/excel/entity/MultiWorksheetTest.java b/src/test/java/org/ttzero/excel/entity/MultiWorksheetTest.java
index 4fdacbeb..150a486d 100644
--- a/src/test/java/org/ttzero/excel/entity/MultiWorksheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/MultiWorksheetTest.java
@@ -64,9 +64,9 @@ public class MultiWorksheetTest extends SQLWorkbookTest {
                 .addSheet("ListObject", ListObjectSheetTest.Item.randomTestData())
                 // Statement
                 .addSheet("Statement", "select id, name, age from student"
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("姓名", String.class)
-                    , new Sheet.Column("年龄", int.class, n -> n > 14 ? "高龄" : n)
+                    , new Column("学号", int.class)
+                    , new Column("姓名", String.class)
+                    , new Column("年龄", int.class, n -> n > 14 ? "高龄" : n)
                         .setStyleProcessor((o, style, sst) -> {
                             int n = (int) o;
                             if (n > 14) {
@@ -80,9 +80,9 @@ public class MultiWorksheetTest extends SQLWorkbookTest {
                 .addSheet(new EmptySheet("Empty"))
                 // ResultSet
                 .addSheet("ResultSet", rs
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("姓名", String.class)
-                    , new Sheet.Column("年龄", int.class)
+                    , new Column("学号", int.class)
+                    , new Column("姓名", String.class)
+                    , new Column("年龄", int.class)
                 )
                 // Customize
                 .addSheet(new CustomizeDataSourceSheet("Customize"))
diff --git a/src/test/java/org/ttzero/excel/entity/ResultSetPagingTest.java b/src/test/java/org/ttzero/excel/entity/ResultSetPagingTest.java
index df8e8838..e577dd03 100644
--- a/src/test/java/org/ttzero/excel/entity/ResultSetPagingTest.java
+++ b/src/test/java/org/ttzero/excel/entity/ResultSetPagingTest.java
@@ -38,11 +38,11 @@ public class ResultSetPagingTest extends SQLWorkbookTest {
                 .watch(Print::println)
                 .setConnection(con)
                 .addSheet(rs
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("性名", String.class)
-                    , new Sheet.Column("年龄", int.class)
-                    , new Sheet.Column("创建时间", Timestamp.class)
-                    , new Sheet.Column("更新", Timestamp.class)
+                    , new Column("学号", int.class)
+                    , new Column("性名", String.class)
+                    , new Column("年龄", int.class)
+                    , new Column("创建时间", Timestamp.class)
+                    , new Column("更新", Timestamp.class)
                 )
             .setWorkbookWriter(new ReLimitXMLWorkbookWriter())
             .writeTo(defaultTestPath);
diff --git a/src/test/java/org/ttzero/excel/entity/ResultSetSheetTest.java b/src/test/java/org/ttzero/excel/entity/ResultSetSheetTest.java
index 39999334..0f6772c3 100644
--- a/src/test/java/org/ttzero/excel/entity/ResultSetSheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/ResultSetSheetTest.java
@@ -40,11 +40,11 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
                 .watch(Print::println)
                 .setConnection(con)
                 .addSheet(rs
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("性名", String.class)
-                    , new Sheet.Column("年龄", Integer.class)
-                    , new Sheet.Column("创建时间", Timestamp.class)
-                    , new Sheet.Column("更新", Timestamp.class)
+                    , new Column("学号", int.class)
+                    , new Column("性名", String.class)
+                    , new Column("年龄", Integer.class)
+                    , new Column("创建时间", Timestamp.class)
+                    , new Column("更新", Timestamp.class)
                 )
                 .writeTo(defaultTestPath);
         }
@@ -96,11 +96,11 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor4", author)
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student"
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ).setRs(rs))
                 .writeTo(defaultTestPath);
         }
@@ -115,11 +115,11 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor5", author)
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student", WaterMark.of(author)
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ).setRs(rs))
                 .writeTo(defaultTestPath);
         }
@@ -160,11 +160,11 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor8", author)
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet(rs
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
@@ -179,11 +179,11 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor9", author)
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student", rs
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
@@ -198,11 +198,11 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor10", author)
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet(rs, WaterMark.of(author)
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
@@ -217,11 +217,11 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor11", author)
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student", rs, WaterMark.of(author)
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("AGE", int.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
@@ -236,11 +236,11 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet different type from metadata", author)
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student", rs, WaterMark.of(author)
-                    , new Sheet.Column("ID", String.class)  // Integer in database
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", String.class) // // Integer in database
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", String.class)  // Integer in database
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", String.class) // // Integer in database
+                    , new Column("AGE", int.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
diff --git a/src/test/java/org/ttzero/excel/entity/StatementSheetTest.java b/src/test/java/org/ttzero/excel/entity/StatementSheetTest.java
index 6ceaef30..0e107cbf 100644
--- a/src/test/java/org/ttzero/excel/entity/StatementSheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/StatementSheetTest.java
@@ -64,11 +64,11 @@ public class StatementSheetTest extends SQLWorkbookTest {
                 .setAutoSize(autoSize)
                 .setConnection(con)
                 .addSheet("select id, name, age, create_date, update_date from student order by age"
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("性名", String.class)
-                    , new Sheet.Column("年龄", int.class)
-                    , new Sheet.Column("创建时间", Timestamp.class)
-                    , new Sheet.Column("更新", Timestamp.class)
+                    , new Column("学号", int.class)
+                    , new Column("性名", String.class)
+                    , new Column("年龄", int.class)
+                    , new Column("创建时间", Timestamp.class).setColIndex(0)
+                    , new Column("更新", Timestamp.class)
                 )
                 .writeTo(defaultTestPath);
         }
@@ -80,9 +80,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
                 .setAutoSize(autoSize)
                 .setConnection(con)
                 .addSheet("select id, name, age, create_date, update_date from student"
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("性名", String.class)
-                    , new Sheet.Column("年龄", int.class)
+                    , new Column("学号", int.class)
+                    , new Column("性名", String.class)
+                    , new Column("年龄", int.class)
                         .setStyleProcessor((o, style, sst) -> {
                             Integer n = (Integer) o;
                             if (n == null || n < 10) {
@@ -91,8 +91,8 @@ public class StatementSheetTest extends SQLWorkbookTest {
                             }
                             return style;
                         })
-                    , new Sheet.Column("创建时间", Timestamp.class)
-                    , new Sheet.Column("更新", Timestamp.class)
+                    , new Column("创建时间", Timestamp.class)
+                    , new Column("更新", Timestamp.class)
                 )
                 .writeTo(defaultTestPath);
         }
@@ -105,9 +105,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
                 .setAutoSize(autoSize)
                 .watch(Print::println)
                 .addSheet("select id, name, age, create_date, update_date from student"
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("姓名", String.class)
-                    , new Sheet.Column("年龄", int.class, n -> n > 14 ? "高龄" : n)
+                    , new Column("学号", int.class)
+                    , new Column("姓名", String.class)
+                    , new Column("年龄", int.class, n -> n > 14 ? "高龄" : n)
                         .setStyleProcessor((o, style, sst) -> {
                             Integer n = (Integer) o;
                             if (n == null || n > 14) {
@@ -116,8 +116,8 @@ public class StatementSheetTest extends SQLWorkbookTest {
                             }
                             return style;
                         })
-                    , new Sheet.Column("创建时间", Timestamp.class)
-                    , new Sheet.Column("更新", Timestamp.class)
+                    , new Column("创建时间", Timestamp.class)
+                    , new Column("更新", Timestamp.class)
                 )
                 .writeTo(defaultTestPath);
         }
@@ -170,11 +170,11 @@ public class StatementSheetTest extends SQLWorkbookTest {
             new Workbook("test statement sheet Constructor5", author)
                 .watch(Print::println)
                 .addSheet(new StatementSheet(con, "select id, name, age, create_date, update_date from student limit 10"
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
@@ -185,11 +185,11 @@ public class StatementSheetTest extends SQLWorkbookTest {
             new Workbook("test statement sheet Constructor6", author)
                 .watch(Print::println)
                 .addSheet(new StatementSheet("Student", con, "select id, name, age, create_date, update_date from student limit 10"
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
@@ -204,11 +204,11 @@ public class StatementSheetTest extends SQLWorkbookTest {
                         ps.setInt(1, 10);
                         ps.setInt(2, 20);
                     }
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
@@ -223,11 +223,11 @@ public class StatementSheetTest extends SQLWorkbookTest {
                         ps.setInt(1, 10);
                         ps.setInt(2, 20);
                     }
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
-                    , new Sheet.Column("CREATE_DATE", Timestamp.class)
-                    , new Sheet.Column("UPDATE_DATE", Timestamp.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
+                    , new Column("CREATE_DATE", Timestamp.class)
+                    , new Column("UPDATE_DATE", Timestamp.class)
                 ))
                 .writeTo(defaultTestPath);
         }
@@ -279,9 +279,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
             new Workbook("test statement sheet Constructor13", author)
                 .watch(Print::println)
                 .addSheet(new StatementSheet("Student", WaterMark.of(author)
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class))
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class))
                     .setPs(con.prepareStatement("select id, name, age, create_date, update_date from student limit 10")))
                 .writeTo(defaultTestPath);
         }
@@ -305,11 +305,11 @@ public class StatementSheetTest extends SQLWorkbookTest {
             new Workbook("test Statement different type from metadata", author)
                 .watch(Print::println)
                 .addSheet(new StatementSheet(con, "select id, name, age, create_date, update_date from student limit 10"
-                    , new Sheet.Column("ID", String.class)  // Integer in database
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", String.class) // Integer in database
-                    , new Sheet.Column("CREATE_DATE", String.class) // Timestamp in database
-                    , new Sheet.Column("UPDATE_DATE", String.class) // Timestamp in database
+                    , new Column("ID", String.class)  // Integer in database
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", String.class) // Integer in database
+                    , new Column("CREATE_DATE", String.class) // Timestamp in database
+                    , new Column("UPDATE_DATE", String.class) // Timestamp in database
                 ))
                 .writeTo(defaultTestPath);
         }
diff --git a/src/test/java/org/ttzero/excel/entity/csv/ListMapSheetTest.java b/src/test/java/org/ttzero/excel/entity/csv/ListMapSheetTest.java
index a061c26d..ef20fa18 100644
--- a/src/test/java/org/ttzero/excel/entity/csv/ListMapSheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/csv/ListMapSheetTest.java
@@ -18,6 +18,7 @@ package org.ttzero.excel.entity.csv;
 
 import org.junit.Test;
 import org.ttzero.excel.Print;
+import org.ttzero.excel.entity.Column;
 import org.ttzero.excel.entity.ListMapSheet;
 import org.ttzero.excel.entity.Sheet;
 import org.ttzero.excel.entity.Workbook;
@@ -66,21 +67,21 @@ public class ListMapSheetTest extends WorkbookTest {
         new Workbook("test header column map")
             .watch(Print::println)
             .addSheet(createAllTypeData()
-                , new Sheet.Column("boolean", "bv", boolean.class)
-                , new Sheet.Column("char", "cv", char.class)
-                , new Sheet.Column("short", "sv", short.class)
-                , new Sheet.Column("int", "nv", int.class)
-                , new Sheet.Column("long", "lv", long.class)
-                , new Sheet.Column("float", "fv", float.class)
-                , new Sheet.Column("double", "dv", double.class)
-                , new Sheet.Column("string", "s", String.class)
-                , new Sheet.Column("decimal", "mv", BigDecimal.class)
-                , new Sheet.Column("date", "av", Date.class)
-                , new Sheet.Column("timestamp", "iv", Timestamp.class)
-                , new Sheet.Column("time", "tv", Time.class)
-                , new Sheet.Column("LocalDate", "ldv", LocalDate.class)
-                , new Sheet.Column("LocalDateTime", "ldtv", LocalDateTime.class)
-                , new Sheet.Column("LocalTime", "ltv", LocalTime.class)
+                , new Column("boolean", "bv", boolean.class)
+                , new Column("char", "cv", char.class)
+                , new Column("short", "sv", short.class)
+                , new Column("int", "nv", int.class)
+                , new Column("long", "lv", long.class)
+                , new Column("float", "fv", float.class)
+                , new Column("double", "dv", double.class)
+                , new Column("string", "s", String.class)
+                , new Column("decimal", "mv", BigDecimal.class)
+                , new Column("date", "av", Date.class)
+                , new Column("timestamp", "iv", Timestamp.class)
+                , new Column("time", "tv", Time.class)
+                , new Column("LocalDate", "ldv", LocalDate.class)
+                , new Column("LocalDateTime", "ldtv", LocalDateTime.class)
+                , new Column("LocalTime", "ltv", LocalTime.class)
             )
             .saveAsCSV()
             .writeTo(getOutputTestPath());
@@ -90,12 +91,12 @@ public class ListMapSheetTest extends WorkbookTest {
         new Workbook("test header column box type map")
             .watch(Print::println)
             .addSheet(createAllTypeData()
-                , new Sheet.Column("Character", "cv", Character.class)
-                , new Sheet.Column("Short", "sv", Short.class)
-                , new Sheet.Column("Integer", "nv", Integer.class)
-                , new Sheet.Column("Long", "lv", Long.class)
-                , new Sheet.Column("Float", "fv", Float.class)
-                , new Sheet.Column("Double", "dv", Double.class)
+                , new Column("Character", "cv", Character.class)
+                , new Column("Short", "sv", Short.class)
+                , new Column("Integer", "nv", Integer.class)
+                , new Column("Long", "lv", Long.class)
+                , new Column("Float", "fv", Float.class)
+                , new Column("Double", "dv", Double.class)
             )
             .saveAsCSV()
             .writeTo(getOutputTestPath());
@@ -121,21 +122,21 @@ public class ListMapSheetTest extends WorkbookTest {
         new Workbook("test list map sheet Constructor3")
             .watch(Print::println)
             .addSheet(new ListMapSheet("Map"
-                , new Sheet.Column("boolean", "bv", boolean.class)
-                , new Sheet.Column("char", "cv", char.class)
-                , new Sheet.Column("short", "sv", short.class)
-                , new Sheet.Column("int", "nv", int.class)
-                , new Sheet.Column("long", "lv", long.class)
-                , new Sheet.Column("float", "fv", float.class)
-                , new Sheet.Column("double", "dv", double.class)
-                , new Sheet.Column("string", "s", String.class)
-                , new Sheet.Column("decimal", "mv", BigDecimal.class)
-                , new Sheet.Column("date", "av", Date.class)
-                , new Sheet.Column("timestamp", "iv", Timestamp.class)
-                , new Sheet.Column("time", "tv", Time.class)
-                , new Sheet.Column("LocalDate", "ldv", LocalDate.class)
-                , new Sheet.Column("LocalDateTime", "ldtv", LocalDateTime.class)
-                , new Sheet.Column("LocalTime", "ltv", LocalTime.class)
+                , new Column("boolean", "bv", boolean.class)
+                , new Column("char", "cv", char.class)
+                , new Column("short", "sv", short.class)
+                , new Column("int", "nv", int.class)
+                , new Column("long", "lv", long.class)
+                , new Column("float", "fv", float.class)
+                , new Column("double", "dv", double.class)
+                , new Column("string", "s", String.class)
+                , new Column("decimal", "mv", BigDecimal.class)
+                , new Column("date", "av", Date.class)
+                , new Column("timestamp", "iv", Timestamp.class)
+                , new Column("time", "tv", Time.class)
+                , new Column("LocalDate", "ldv", LocalDate.class)
+                , new Column("LocalDateTime", "ldtv", LocalDateTime.class)
+                , new Column("LocalTime", "ltv", LocalTime.class)
             )
                 .setData(createAllTypeData(10)))
             .saveAsCSV()
@@ -161,12 +162,12 @@ public class ListMapSheetTest extends WorkbookTest {
         new Workbook("test list map sheet Constructor7")
             .watch(Print::println)
             .addSheet(new ListMapSheet(createAllTypeData(10)
-                , new Sheet.Column("Character", "cv", Character.class)
-                , new Sheet.Column("Short", "sv", Short.class)
-                , new Sheet.Column("Integer", "nv", Integer.class)
-                , new Sheet.Column("Long", "lv", Long.class)
-                , new Sheet.Column("Float", "fv", Float.class)
-                , new Sheet.Column("Double", "dv", Double.class)))
+                , new Column("Character", "cv", Character.class)
+                , new Column("Short", "sv", Short.class)
+                , new Column("Integer", "nv", Integer.class)
+                , new Column("Long", "lv", Long.class)
+                , new Column("Float", "fv", Float.class)
+                , new Column("Double", "dv", Double.class)))
             .saveAsCSV()
             .writeTo(getOutputTestPath());
     }
@@ -175,8 +176,8 @@ public class ListMapSheetTest extends WorkbookTest {
         new Workbook("test list map sheet Constructor8")
             .watch(Print::println)
             .addSheet(new ListMapSheet("MAP", createTestData(10)
-                , new Sheet.Column("ID", "id", int.class)
-                , new Sheet.Column("NAME", "name", String.class)))
+                , new Column("ID", "id", int.class)
+                , new Column("NAME", "name", String.class)))
             .saveAsCSV()
             .writeTo(getOutputTestPath());
     }
@@ -185,8 +186,8 @@ public class ListMapSheetTest extends WorkbookTest {
         new Workbook("test list map sheet Constructor9")
             .watch(Print::println)
             .addSheet(new ListMapSheet(createTestData(10)
-                , new Sheet.Column("ID", "id")
-                , new Sheet.Column("NAME", "name")))
+                , new Column("ID", "id")
+                , new Column("NAME", "name")))
             .saveAsCSV()
             .writeTo(getOutputTestPath());
     }
@@ -196,8 +197,8 @@ public class ListMapSheetTest extends WorkbookTest {
             .watch(Print::println)
             .addSheet(new ListMapSheet("MAP"
                 , createTestData(10)
-                , new Sheet.Column("ID", "id", int.class)
-                , new Sheet.Column("NAME", "name", String.class)))
+                , new Column("ID", "id", int.class)
+                , new Column("NAME", "name", String.class)))
             .saveAsCSV()
             .writeTo(getOutputTestPath());
     }
diff --git a/src/test/java/org/ttzero/excel/entity/csv/ListObjectSheetTest.java b/src/test/java/org/ttzero/excel/entity/csv/ListObjectSheetTest.java
index d0f936dd..d9b022d0 100644
--- a/src/test/java/org/ttzero/excel/entity/csv/ListObjectSheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/csv/ListObjectSheetTest.java
@@ -19,6 +19,7 @@ package org.ttzero.excel.entity.csv;
 import org.junit.Test;
 import org.ttzero.excel.Print;
 import org.ttzero.excel.annotation.ExcelColumn;
+import org.ttzero.excel.entity.Column;
 import org.ttzero.excel.entity.CustomizeDataSourceSheet;
 import org.ttzero.excel.entity.ExcelWriteException;
 import org.ttzero.excel.entity.ListSheet;
@@ -98,9 +99,9 @@ public class ListObjectSheetTest extends WorkbookTest{
         new Workbook("test int conversion")
             .watch(Print::println)
             .addSheet(Student.randomTestData()
-                , new Sheet.Column("学号", "id")
-                , new Sheet.Column("姓名", "name")
-                , new Sheet.Column("成绩", "score", n -> n < 60 ? "不及格" : n)
+                , new Column("学号", "id")
+                , new Column("姓名", "name")
+                , new Column("成绩", "score", n -> n < 60 ? "不及格" : n)
             )
             .saveAsCSV()
             .writeTo(getOutputTestPath());
@@ -110,9 +111,9 @@ public class ListObjectSheetTest extends WorkbookTest{
         new Workbook("object style processor")
             .watch(Print::println)
             .addSheet(Student.randomTestData()
-                , new Sheet.Column("学号", "id")
-                , new Sheet.Column("姓名", "name")
-                , new Sheet.Column("成绩", "score")
+                , new Column("学号", "id")
+                , new Column("姓名", "name")
+                , new Column("成绩", "score")
                     .setStyleProcessor((o, style, sst) -> {
                         if ((int)o < 60) {
                             style = Styles.clearFill(style)
@@ -129,9 +130,9 @@ public class ListObjectSheetTest extends WorkbookTest{
         new Workbook("object style and style processor")
             .watch(Print::println)
             .addSheet(Student.randomTestData()
-                , new Sheet.Column("学号", "id")
-                , new Sheet.Column("姓名", "name")
-                , new Sheet.Column("成绩", "score", n -> n < 60 ? "不及格" : n)
+                , new Column("学号", "id")
+                , new Column("姓名", "name")
+                , new Column("成绩", "score", n -> n < 60 ? "不及格" : n)
                     .setStyleProcessor((o, style, sst) -> {
                         if ((int)o < 60) {
                             style = Styles.clearFill(style)
@@ -182,9 +183,9 @@ public class ListObjectSheetTest extends WorkbookTest{
     public void testStyleConversion1() throws IOException {
         new Workbook("object style processor1", "guanquan.wang")
             .addSheet(new ListSheet<>("期末成绩", Student.randomTestData()
-                    , new Sheet.Column("学号", "id")
-                    , new Sheet.Column("姓名", "name")
-                    , new Sheet.Column("成绩", "score", conversion)
+                    , new Column("学号", "id")
+                    , new Column("姓名", "name")
+                    , new Column("成绩", "score", conversion)
                     .setStyleProcessor(sp)
                 )
             )
@@ -204,9 +205,9 @@ public class ListObjectSheetTest extends WorkbookTest{
         try {
             new Workbook("field un-declare")
                 .addSheet(new ListSheet<>("期末成绩", Student.randomTestData()
-                        , new Sheet.Column("学号", "id")
-                        , new Sheet.Column("姓名", "name")
-                        , new Sheet.Column("成绩", "sore") // un-declare field
+                        , new Column("学号", "id")
+                        , new Column("姓名", "name")
+                        , new Column("成绩", "sore") // un-declare field
                     )
                 )
                 .saveAsCSV()
diff --git a/src/test/java/org/ttzero/excel/entity/csv/ResultSetSheetTest.java b/src/test/java/org/ttzero/excel/entity/csv/ResultSetSheetTest.java
index defea808..b5d3ef80 100644
--- a/src/test/java/org/ttzero/excel/entity/csv/ResultSetSheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/csv/ResultSetSheetTest.java
@@ -18,6 +18,7 @@ package org.ttzero.excel.entity.csv;
 
 import org.junit.Test;
 import org.ttzero.excel.Print;
+import org.ttzero.excel.entity.Column;
 import org.ttzero.excel.entity.ExcelWriteException;
 import org.ttzero.excel.entity.ResultSetSheet;
 import org.ttzero.excel.entity.SQLWorkbookTest;
@@ -44,9 +45,9 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
                 .watch(Print::println)
                 .setConnection(con)
                 .addSheet(rs
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("性名", String.class)
-                    , new Sheet.Column("年龄", int.class)
+                    , new Column("学号", int.class)
+                    , new Column("性名", String.class)
+                    , new Column("年龄", int.class)
                 )
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -102,9 +103,9 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor4")
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student"
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class))
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class))
                     .setRs(rs))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -120,9 +121,9 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor5")
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student"
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class))
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class))
                     .setRs(rs))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -166,9 +167,9 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor8")
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet(rs
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
                 ))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -184,9 +185,9 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor9")
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student", rs
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
                 ))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -202,9 +203,9 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor10")
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet(rs
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
                 ))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -220,9 +221,9 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet sheet Constructor11")
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student", rs
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
                 ))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -238,9 +239,9 @@ public class ResultSetSheetTest extends SQLWorkbookTest {
             new Workbook("test ResultSet different type from metadata")
                 .watch(Print::println)
                 .addSheet(new ResultSetSheet("Student", rs
-                    , new Sheet.Column("ID", String.class)  // Integer in database
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", String.class) // // Integer in database
+                    , new Column("ID", String.class)  // Integer in database
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", String.class) // // Integer in database
                 ))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
diff --git a/src/test/java/org/ttzero/excel/entity/csv/StatementSheetTest.java b/src/test/java/org/ttzero/excel/entity/csv/StatementSheetTest.java
index 3806410c..3e52d33a 100644
--- a/src/test/java/org/ttzero/excel/entity/csv/StatementSheetTest.java
+++ b/src/test/java/org/ttzero/excel/entity/csv/StatementSheetTest.java
@@ -18,6 +18,7 @@ package org.ttzero.excel.entity.csv;
 
 import org.junit.Test;
 import org.ttzero.excel.Print;
+import org.ttzero.excel.entity.Column;
 import org.ttzero.excel.entity.ExcelWriteException;
 import org.ttzero.excel.entity.SQLWorkbookTest;
 import org.ttzero.excel.entity.Sheet;
@@ -42,9 +43,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
                 .watch(Print::println)
                 .setConnection(con)
                 .addSheet("select id, name, age from student order by age"
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("性名", String.class)
-                    , new Sheet.Column("年龄", int.class)
+                    , new Column("学号", int.class)
+                    , new Column("性名", String.class)
+                    , new Column("年龄", int.class)
                 )
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -57,9 +58,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
                 .watch(Print::println)
                 .setConnection(con)
                 .addSheet("select id, name, age from student"
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("性名", String.class)
-                    , new Sheet.Column("年龄", int.class)
+                    , new Column("学号", int.class)
+                    , new Column("性名", String.class)
+                    , new Column("年龄", int.class)
                         .setStyleProcessor((o, style, sst) -> {
                             int n = (int) o;
                             if (n < 10) {
@@ -80,9 +81,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
                 .setConnection(con)
                 .watch(Print::println)
                 .addSheet("select id, name, age from student"
-                    , new Sheet.Column("学号", int.class)
-                    , new Sheet.Column("姓名", String.class)
-                    , new Sheet.Column("年龄", int.class, n -> n > 14 ? "高龄" : n)
+                    , new Column("学号", int.class)
+                    , new Column("姓名", String.class)
+                    , new Column("年龄", int.class, n -> n > 14 ? "高龄" : n)
                         .setStyleProcessor((o, style, sst) -> {
                             int n = (int) o;
                             if (n > 14) {
@@ -148,9 +149,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
             new Workbook("test statement sheet Constructor5")
                 .watch(Print::println)
                 .addSheet(new StatementSheet(con, "select id, name, age from student limit 10"
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
                 ))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -162,9 +163,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
             new Workbook("test statement sheet Constructor6")
                 .watch(Print::println)
                 .addSheet(new StatementSheet("Student", con, "select id, name, age from student limit 10"
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)
                 ))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -180,9 +181,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
                         ps.setInt(1, 10);
                         ps.setInt(2, 20);
                     }
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)))
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
         }
@@ -197,9 +198,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
                         ps.setInt(1, 10);
                         ps.setInt(2, 20);
                     }
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class)))
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class)))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
         }
@@ -255,9 +256,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
             new Workbook("test statement sheet Constructor13")
                 .watch(Print::println)
                 .addSheet(new StatementSheet("Student"
-                    , new Sheet.Column("ID", int.class)
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", int.class))
+                    , new Column("ID", int.class)
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", int.class))
                     .setPs(con.prepareStatement("select id, name, age from student limit 10")))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());
@@ -282,9 +283,9 @@ public class StatementSheetTest extends SQLWorkbookTest {
             new Workbook("test Statement different type from metadata")
                 .watch(Print::println)
                 .addSheet(new StatementSheet(con, "select id, name, age from student limit 10"
-                    , new Sheet.Column("ID", String.class)  // Integer in database
-                    , new Sheet.Column("NAME", String.class)
-                    , new Sheet.Column("AGE", String.class) // Integer in database
+                    , new Column("ID", String.class)  // Integer in database
+                    , new Column("NAME", String.class)
+                    , new Column("AGE", String.class) // Integer in database
                 ))
                 .saveAsCSV()
                 .writeTo(getOutputTestPath());