POI中可能会用到一些需要设置EXCEL单元格格式的操作小结

 

POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 

先获取工作薄对象: 


Java代码 
HSSFWorkbook wb = new HSSFWorkbook();  
   
HSSFSheet sheet = wb.createSheet();  
   
HSSFCellStyle setBorder = wb.createCellStyle();  
HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet sheet = wb.createSheet();

HSSFCellStyle setBorder = wb.createCellStyle();

一、设置背景色: 

Java代码 
setBorder.setFillForegroundColor((short) 13);// 设置背景色  
setBorder.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
setBorder.setFillForegroundColor((short) 13);// 设置背景色
setBorder.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

二、设置边框: 


Java代码 
setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框  
setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框  
setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框  
setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框  


setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

三、设置居中: 

Java代码 
setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中  
setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中

四、设置字体: 


Java代码 
HSSFFont font = wb.createFont();  
font.setFontName("黑体");  
font.setFontHeightInPoints((short) 16);//设置字体大小  
   
HSSFFont font2 = wb.createFont();  
font2.setFontName("仿宋_GB2312");  
font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示  
font2.setFontHeightInPoints((short) 12);  
   
setBorder.setFont(font);//选择需要用到的字体格式  
HSSFFont font = wb.createFont();
font.setFontName("黑体");
font.setFontHeightInPoints((short) 16);//设置字体大小

HSSFFont font2 = wb.createFont();
font2.setFontName("仿宋_GB2312");
font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
font2.setFontHeightInPoints((short) 12);

setBorder.setFont(font);//选择需要用到的字体格式

五、设置列宽: 


Java代码 
sheet.setColumnWidth(0, 3766); //第一个参数代表列id(从0开始),第2个参数代表宽度值  
sheet.setColumnWidth(0, 3766); //第一个参数代表列id(从0开始),第2个参数代表宽度值

六、设置自动换行: 


Java代码 
setBorder.setWrapText(true);//设置自动换行  
setBorder.setWrapText(true);//设置自动换行

七、合并单元格: 


Java代码 
Region region1 = new Region(0, (short) 0, 0, (short) 6);  
   
//参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号  
sheet.addMergedRegion(region1);  
Region region1 = new Region(0, (short) 0, 0, (short) 6);

//参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号
sheet.addMergedRegion(region1);

附一个完整的例子: 


Java代码 
package cn.com.util;  
   
import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
import org.apache.poi.hssf.usermodel.HSSFFont;  
import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFRow;  
import org.apache.poi.hssf.usermodel.HSSFCell;  
import org.apache.poi.hssf.util.CellRangeAddress;  
import org.apache.poi.hssf.util.Region;  
import org.apache.poi.ss.usermodel.CellStyle;  
   
import java.io.FileOutputStream;  
   
import javax.servlet.http.HttpServlet;  
   
public class CreateXL extends HttpServlet {  
/** Excel 文件要存放的位置,假定在D盘下 */  
public static String outputFile = "c:\\test.xls";  
   
private void cteateCell(HSSFWorkbook wb, HSSFRow row, short col, String val) {  
HSSFCell cell = row.createCell(col);  
// cell.setEncoding(HSSFCell.ENCODING_UTF_16);  
cell.setCellValue(val);  
HSSFCellStyle cellstyle = wb.createCellStyle();  
cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);  
cell.setCellStyle(cellstyle);  
}  
   
public static void main(String argv[]) {  
try {  
// 创建新的Excel 工作簿  
HSSFWorkbook workbook = new HSSFWorkbook();  
   
// 设置字体  
HSSFFont font = workbook.createFont();  
// font.setColor(HSSFFont.COLOR_RED);  
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
font.setFontHeightInPoints((short) 14);  
   
// HSSFFont font2 = workbook.createFont();  
// font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
// font.setFontHeightInPoints((short)14);  
   
// 设置样式  
HSSFCellStyle cellStyle = workbook.createCellStyle();  
cellStyle.setFont(font);  
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
   
// HSSFCellStyle cellStyle2= workbook.createCellStyle();  
// cellStyle.setFont(font2);  
// cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
   
// 在Excel工作簿中建一工作表,其名为缺省值  
// 如要新建一名为"月报表"的工作表,其语句为:  
HSSFSheet sheet = workbook.createSheet("月报表");  
CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0,  
11);  
sheet.addMergedRegion(cellRangeAddress);  
   
//第一行  
// 在索引0的位置创建行(最顶端的行)  
HSSFRow row = sheet.createRow(0);  
// 在索引0的位置创建单元格(左上端)  
HSSFCell cell = row.createCell(0);  
// 定义单元格为字符串类型  
cell.setCellType(HSSFCell.CELL_TYPE_STRING);  
cell.setCellStyle(cellStyle);  
// 在单元格中输入一些内容  
cell.setCellValue(new HSSFRichTextString("北京亿卡联科技发展有限公司小区门禁维修月报表"));  
   
//第二行  
cellRangeAddress = new CellRangeAddress(1, 1, 3, 6);  
sheet.addMergedRegion(cellRangeAddress);  
row = sheet.createRow(1);  
HSSFCell datecell = row.createCell(3);  
datecell.setCellType(HSSFCell.CELL_TYPE_STRING);  
datecell.setCellStyle(cellStyle);  
datecell.setCellValue("时间间隔xxxxx");  
   
cellRangeAddress = new CellRangeAddress(1, 1, 9,  
10);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(9).setCellValue("单位:元");  
   
//第三行  
row=sheet.createRow(2);  
row.createCell(0).setCellValue("一、");  
row.createCell(1).setCellValue("基本资料");  
   
//第4行  
row=sheet.createRow(3);  
row.createCell(1).setCellValue("小区名称:");  
cellRangeAddress=new CellRangeAddress(3,3,2,11);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(2).setCellValue("xxxxx");  
   
//第5行  
row=sheet.createRow(4);  
row.createCell(1).setCellValue("座落地点:");  
cellRangeAddress=new CellRangeAddress(4,4,2,11);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(2).setCellValue("xxxxx");  
   
//第6行  
row=sheet.createRow(5);  
row.createCell(1).setCellValue("建成年月:");  
cellRangeAddress=new CellRangeAddress(5,5,2,4);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(2).setCellValue("年月日:xxxxx");  
row.createCell(5).setCellValue("联系人");  
cellRangeAddress=new CellRangeAddress(5,5,6,8);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(6).setCellValue("XXX");  
row.createCell(9).setCellValue("电话");  
cellRangeAddress=new CellRangeAddress(5,5,10,11);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(10).setCellValue("XXX");  
   
//第7行  
row=sheet.createRow(6);  
row.createCell(1).setCellValue("住户:");  
row.createCell(2).setCellValue("(XX)");  
row.createCell(3).setCellValue("(户)");  
cellRangeAddress=new CellRangeAddress(6,6,4,5);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(4).setCellValue("共计( )");  
row.createCell(6).setCellValue("幢");  
cellRangeAddress=new CellRangeAddress(6,6,7,8);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(7).setCellValue("发卡张数");  
cellRangeAddress=new CellRangeAddress(6,6,9,10);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(9).setCellValue("xxxx");  
   
   
//第9行  
row=sheet.createRow(8);  
row.createCell(0).setCellValue("二、");  
cellRangeAddress=new CellRangeAddress(8,8,1,2);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(1).setCellValue("维修用材料台账");  
row.createCell(6).setCellValue("三、");  
cellRangeAddress=new CellRangeAddress(8,8,7,9);  
sheet.addMergedRegion(cellRangeAddress);  
row.createCell(7).setCellValue("维修工时记录");  
//第10行  
row=sheet.createRow(9);  
row.createCell(0).setCellValue("日期");  
row.createCell(1).setCellValue("维修事项");  
row.createCell(2).setCellValue("材料清单");  
row.createCell(3).setCellValue("数量");  
row.createCell(4).setCellValue("单价");  
row.createCell(5).setCellValue("材料金额");  
   
row.createCell(7).setCellValue("日期");  
row.createCell(8).setCellValue("技工");  
row.createCell(9).setCellValue("工时数");  
row.createCell(10).setCellValue("单价");  
row.createCell(11).setCellValue("工时金额");  
   
//填充数据  
for (int i = 0; i < 10; i++) {  
row=sheet.createRow(9+i+1);  
row.createCell(0).setCellValue("日期");  
row.createCell(1).setCellValue("维修事项");  
row.createCell(2).setCellValue("材料清单");  
row.createCell(3).setCellValue("数量");  
row.createCell(4).setCellValue("单价");  
row.createCell(5).setCellValue("材料金额");  
   
row.createCell(7).setCellValue("日期");  
row.createCell(8).setCellValue("技工");  
row.createCell(9).setCellValue("工时数");  
row.createCell(10).setCellValue("单价");  
row.createCell(11).setCellValue("工时金额");  
}  
   
   
//第n+10行  
row=sheet.createRow(9+10+1);  
//cellRangeAddress=new CellRangeAddress(19,19,0,4);  
//sheet.addMergedRegion(cellRangeAddress);  
row.createCell(0).setCellValue("累计:");  
row.createCell(1).setCellValue("xxx");  
row.createCell(7).setCellValue("累计:");  
row.createCell(8).setCellValue("xxx");  
   
   
   
   
// 新建一输出文件流  
FileOutputStream fOut = new FileOutputStream(outputFile);  
// 把相应的Excel 工作簿存盘  
workbook.write(fOut);  
fOut.flush();  
// 操作结束,关闭文件  
fOut.close();  
System.out.println("文件生成...");  
} catch (Exception e) {  
System.out.println("已运行 xlCreate() : " + e);  
}  
}  

 

 

在Excel中我们经常要设置格式,比如说日期格式(yyyymmdd)、小数点格式(1.20)、货币格式($2000)、百分比格式(99.99%)等等,这些东西在过去我们恐怕只能在服务器端生成好,不但增加了服务器端的代码量,还造成了不必要的字符串替换操作,如今NPOI将让服务器从这种完全没有必要的操作中解放出来,一切都将由Excel在客户端处理。

使用NPOI时要注意,所有的格式都是通过CellStyle.DataFormat赋给单元格的,而不是直接赋给单元格。

案例一 日期格式

假设我们现在需要显示的日期的格式为2008年5月5日,可以用下面的代码生成:

HSSFSheet sheet = hssfworkbook.CreateSheet("new sheet");

HSSFCell cell = sheet.CreateRow(0).CreateCell(0);

cell.SetCellValue(new DateTime(2008,5,5));

//set date format

HSSFCellStyle cellStyle = hssfworkbook.CreateCellStyle();

HSSFDataFormat format = hssfworkbook.CreateDataFormat();

cellStyle.DataFormat = format.GetFormat("yyyy年m月d日");

cell.CellStyle=cellStyle;

由于这里的“yyyy年m月d日”属于自定义格式(区别于Excel内嵌的格式),所以必须用hssfworkbook.CreateDataFormat()创建一个HSSFDataFormat实例,然后使用format.GetFormat来获取相应的格式,只要是Excel支持的格式表示方式,这种方式都能够实现。

案例二 保留2位小数

假设我们有个单元格的值为1.2,怎么显示成1.20呢?在Excel中可以用“0.00”来表示,所以下面的代码就能完成:

// Create a row and put some cells in it. Rows are 0 based.

HSSFCell cell = sheet.CreateRow(0).CreateCell(0);

//set value for the cell

cell.SetCellValue(1.2);

//number format with 2 digits after the decimal point - "1.20"

HSSFCellStyle cellStyle = hssfworkbook.CreateCellStyle();

cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");

cell.CellStyle = cellStyle;

这里与上面有所不同,用的是HSSFDataFormat.GetBuiltinFormat()方法,之所以用这个,是因为0.00是Excel内嵌的格式,完整的Excel内嵌格式列表大家可以看这个窗口中的自定义列表:

这里就不一一列出了。

案例三 货币格式

货币格式在金融的项目中经常用到,比如说人民币符号¥,美元符号$等,这里可以用下面的代码表示:

HSSFCell cell2 = sheet.CreateRow(1).CreateCell(0);

cell2.SetCellValue(20000);

HSSFCellStyle cellStyle2 = hssfworkbook.CreateCellStyle();

HSSFDataFormat format = hssfworkbook.CreateDataFormat();

cellStyle2.DataFormat = format.GetFormat("¥#,##0");

cell2.CellStyle = cellStyle2;

注意,这里还加入了千分位分隔符,所以是#,##,至于为什么这么写,你得去问微软,呵呵。

案例四 百分比

百分比在报表中也很常用,其实基本上和上面一样,只是格式表示是0.00%,代码如下:

cellStyle4.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");

由于这里是内嵌格式,所以直接用HSSFDataFormat.GetBuiltinFormat即可。

案例五 中文大写

在表示金额时,我们时常会用到,我也见过不少兄弟实现了数字转中文大小写的工具类,以后你可以尝试让Excel去处理这一切,代码和刚才差不多,也是改格式的表示:

HSSFDataFormat format = hssfworkbook.CreateDataFormat();

cellStyle6.DataFormat = format.GetFormat("[DbNum2][$-804]0");

由于是自定义格式,所以用了HSSFDataFormat.GetFormat,相信你对这两种获取格式的形式的区别越来越熟悉了。

案例六 科学计数法

这东西数学课上我们都学过,虽然用的不多,但是既然Excel支持,这里也提一下:

cellStyle3.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");

下面展示下以上这些例子的显示效果:

最后总结一下HSSFDataFormat.GetFormat和HSSFDataFormat.GetBuiltinFormat的区别:

当使用Excel内嵌的(或者说预定义)的格式时,直接用HSSFDataFormat.GetBuiltinFormat静态方法即可。

当使用自己定义的格式时,必须先调用HSSFWorkbook.CreateDataFormat(),因为这时在底层会先找有没有匹配的内嵌FormatRecord,如果没有就会新建一个FormatRecord,所以必须先调用这个方法,然后你就可以用获得的HSSFDataFormat实例的GetFormat方法了,当然相对而言这种方式比较麻烦,所以内嵌格式还是用HSSFDataFormat.GetBuiltinFormat静态方法更加直接一些。不过自定义的格式也不是天马行空随便定义,还是要参照Excel的格式表示来定义,具体请看相关的Excel教程。

注意:自定义的FormatRecord是嵌入xls文件内部的,所以不用担心对方Excel中有没有定义过这种格式,都是能够正常使用的。

 

 

 

 

 


 

很多人不怎么用Excel中的批注,所以我特地截了张图,让大家知道本节我们要创建的到底是什么东西。





●在过去,我们恐怕没有办法实现这一功能,因为无论是cvs法、html法、oledb法都没有提供这样的接口,当然Office PIA法可以做到,但是性能实在太差,而且稳定性不好,经常莫名其妙crash(这是某某兄弟给我的反馈,我引用了下,呵呵)。在以后的教程中,你将看到更多在过去无法通过传统方法实现的东西,好戏才刚刚开始。

●批注主要有三个属性需要设置,一个是批注的位置和大小、一个是批注的文本、还有一个是批注的作者。

●批注的位置和大小,在Excel中是与单元格密切相关的,NPOI中通过HSSFClientAnchor的实例来表示,它的构造函数比较复杂,有8个参数,它们分别是

  参数

  说明

dx1

第1个单元格中x轴的偏移量

dy1

第1个单元格中y轴的偏移量

dx2

第2个单元格中x轴的偏移量

dy2

第2个单元格中y轴的偏移量

col1

第1个单元格的列号

row1

第1个单元格的行号

col2

第2个单元格的列号

row2

第2个单元格的行号

▲Step by Step:

   △例如,如果我们打算让注释显示在B3和E5之间,就应该这么写:

    HSSFPatriarch patr = sheet.CreateDrawingPatriarch();
    HSSFComment comment1 = patr.CreateComment(new HSSFClientAnchor(0, 0, 0, 0, 1, 2 , 4, 4));

   前4个参数都是位置X,Y轴的偏移,自己试过就知道。

   第5和第6参数:1,2是批注框左上角的位置,第7和第8参数:4,4是批注框右下角的位置,

   △下面我们设置这个批注的内容和作者,这个比较简单:

    comment1.String = new HSSFRichTextString("Hello World");
    comment1.Author = "NPOI Team";

   △最后一步就是把批注赋给某个单元格:

    HSSFCell cell = sheet.CreateRow(1).CreateCell(1);
    cell.CellComment = comment1;

   △对于批注,你有两种选择,一种是隐藏(默认),一种是显示(即表单一打开就显示该批注),可以通过comment1.Visible属性来控制。

   看了上面这张图大家就应该明白了,这里有2个批注,下面那个是显示的,上面那个是隐藏的。

 

 


 

用过Excel的人都知道,单元格是Excel最有意义的东西,我们做任何操作恐怕都要和单元格打交道。在Excel中我们要添加一个单元格只需要点击任何一个单元格,然后输入内容就是了,但是Excel底层其实没有这么简单,不同的单元格是有不同的类型的,比如说数值单元格是用NumberRecord表示,文本单元格是用LabelSSTRecord表示,空单元格是用BlankRecord表示。这也就意味着,在设置单元格时,你必须告诉NPOI你需要创建哪种类型的单元格。

▲Step by Step:

   △要创建单元格首先要创建单元格所在的行,比如,下面的代码创建了第0行:

    HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
    HSSFRow row1=sheet1.CreateRow(0);

     △行建好了,就可以建单元格了,比如创建A1位置的单元格:

    row1.CreateCell(0).SetCellValue(1);

     △这里要说明一下,SetCellValue有好几种重载
   你可以设置单元格为bool、double、DateTime、string和HSSFRichTextString类型。
   其中对于string类型的重载调用的就是HSSFRichTextString类型的重载,所以是一样的,
   HSSFRichTextString可用于有字体或者Unicode的文本。

   △如果你觉得每一行要声明一个HSSFRow很麻烦,可以用下面的方式:

    sheet1.CreateRow(0).CreateCell(0).SetCellValue("This is a Sample");

     △这么用有个前提,那就是第0行还没创建过,否则得这么用:

    sheet1.GetRow(0).CreateCell(0).SetCellValue("This is a Sample");

     △注意:这里的行在Excel里是从1开始的,但是NPOI内部是从0开始的;
   列在Excel里面是用字母表示的,而NPOI中也是用从0开始的数字表示的,所以要注意转换。

     △如果你要获得某一个已经创建的单元格对象,可以用下面的代码:

sheet1.GetRow(row_index).GetCell(column_index);

 

 

Excel生成操作类:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
using System.Data;

namespace StarTech.NPOI
{
    /// <summary>
    /// Excel生成操作类
    /// </summary>
    public class NPOIHelper
    {
        /// <summary>
        /// 导出列名
        /// </summary>
        public static System.Collections.SortedList ListColumnsName;
        /// <summary>
        /// 导出Excel
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="filePath"></param>
        public static void ExportExcel(DataTable dtSource, string filePath)
        {
            if (ListColumnsName == null || ListColumnsName.Count == 0)
                throw (new Exception("请对ListColumnsName设置要导出的列明!"));

            HSSFWorkbook excelWorkbook = CreateExcelFile();
            InsertRow(dtSource, excelWorkbook);
            SaveExcelFile(excelWorkbook, filePath);
        }
        /// <summary>
        /// 导出Excel
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="filePath"></param>
        public static void ExportExcel(DataTable dtSource, Stream excelStream)
        {
            if (ListColumnsName == null || ListColumnsName.Count == 0)
                throw (new Exception("请对ListColumnsName设置要导出的列明!"));

            HSSFWorkbook excelWorkbook = CreateExcelFile();
            InsertRow(dtSource, excelWorkbook);
            SaveExcelFile(excelWorkbook, excelStream);
        }
        /// <summary>
        /// 保存Excel文件
        /// </summary>
        /// <param name="excelWorkBook"></param>
        /// <param name="filePath"></param>
        protected static void SaveExcelFile(HSSFWorkbook excelWorkBook, string filePath)
        {
            FileStream file = null;
            try
            {
                file = new FileStream(filePath, FileMode.Create);
                excelWorkBook.Write(file);
            }
            finally
            {
                if (file != null)
                {
                    file.Close();
                }
            }
        }
        /// <summary>
        /// 保存Excel文件
        /// </summary>
        /// <param name="excelWorkBook"></param>
        /// <param name="filePath"></param>
        protected static void SaveExcelFile(HSSFWorkbook excelWorkBook, Stream excelStream)
        {
            try
            {
                excelWorkBook.Write(excelStream);
            }
            finally
            {

            }
        }
        /// <summary>
        /// 创建Excel文件
        /// </summary>
        /// <param name="filePath"></param>
        protected static HSSFWorkbook CreateExcelFile()
        {
            HSSFWorkbook hssfworkbook = new HSSFWorkbook();
            return hssfworkbook;
        }
        /// <summary>
        /// 创建excel表头
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="excelSheet"></param>
        protected static void CreateHeader(HSSFSheet excelSheet)
        {
            int cellIndex = 0;
            //循环导出列
            foreach (System.Collections.DictionaryEntry de in ListColumnsName)
            {
                HSSFRow newRow = excelSheet.CreateRow(0);
                HSSFCell newCell = newRow.CreateCell(cellIndex);
                newCell.SetCellValue(de.Value.ToString());
                cellIndex++;
            }
        }
        /// <summary>
        /// 插入数据行
        /// </summary>
        protected static void InsertRow(DataTable dtSource, HSSFWorkbook excelWorkbook)
        {
            int rowCount = 0;
            int sheetCount = 1;
            HSSFSheet newsheet = null;

            //循环数据源导出数据集
            newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount);
            CreateHeader(newsheet);
            foreach (DataRow dr in dtSource.Rows)
            {
                rowCount++;
                //超出10000条数据 创建新的工作簿
                if (rowCount == 10000)
                {
                    rowCount = 1;
                    sheetCount++;
                    newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount);
                    CreateHeader(newsheet);
                }

                HSSFRow newRow = newsheet.CreateRow(rowCount);
                InsertCell(dtSource, dr, newRow, newsheet, excelWorkbook);
            }
        }
        /// <summary>
        /// 导出数据行
        /// </summary>
        /// <param name="dtSource"></param>
        /// <param name="drSource"></param>
        /// <param name="currentExcelRow"></param>
        /// <param name="excelSheet"></param>
        /// <param name="excelWorkBook"></param>
        protected static void InsertCell(DataTable dtSource, DataRow drSource, HSSFRow currentExcelRow, HSSFSheet excelSheet, HSSFWorkbook excelWorkBook)
        {
            for (int cellIndex = 0; cellIndex < ListColumnsName.Count; cellIndex++)
            {
                //列名称
                string columnsName = ListColumnsName.GetKey(cellIndex).ToString();
                HSSFCell newCell = null;
                System.Type rowType = drSource[columnsName].GetType();
                string drValue = drSource[columnsName].ToString().Trim();
                switch (rowType.ToString())
                {
                    case "System.String"://字符串类型
                        drValue = drValue.Replace("&", "&");
                        drValue = drValue.Replace(">", ">");
                        drValue = drValue.Replace("<", "<");
                        newCell = currentExcelRow.CreateCell(cellIndex);
                        newCell.SetCellValue(drValue);
                        break;
                    case "System.DateTime"://日期类型
                        DateTime dateV;
                        DateTime.TryParse(drValue, out dateV);
                        newCell = currentExcelRow.CreateCell(cellIndex);
                        newCell.SetCellValue(dateV);

                        //格式化显示
                        HSSFCellStyle cellStyle = excelWorkBook.CreateCellStyle();
                        HSSFDataFormat format = excelWorkBook.CreateDataFormat();
                        cellStyle.DataFormat = format.GetFormat("yyyy-mm-dd hh:mm:ss");
                        newCell.CellStyle = cellStyle;

                        break;
                    case "System.Boolean"://布尔型
                        bool boolV = false;
                        bool.TryParse(drValue, out boolV);
                        newCell = currentExcelRow.CreateCell(cellIndex);
                        newCell.SetCellValue(boolV);
                        break;
                    case "System.Int16"://整型
                    case "System.Int32":
                    case "System.Int64":
                    case "System.Byte":
                        int intV = 0;
                        int.TryParse(drValue, out intV);
                        newCell = currentExcelRow.CreateCell(cellIndex);
                        newCell.SetCellValue(intV.ToString());
                        break;
                    case "System.Decimal"://浮点型
                    case "System.Double":
                        double doubV = 0;
                        double.TryParse(drValue, out doubV);
                        newCell = currentExcelRow.CreateCell(cellIndex);
                        newCell.SetCellValue(doubV);
                        break;
                    case "System.DBNull"://空值处理
                        newCell = currentExcelRow.CreateCell(cellIndex);
                        newCell.SetCellValue("");
                        break;
                    default:
                        throw (new Exception(rowType.ToString() + ":类型数据无法处理!"));
                }
            }
        }
    }
    //排序实现接口 不进行排序 根据添加顺序导出
    public class NoSort : System.Collections.IComparer
    {
        public int Compare(object x, object y)
        {
            return -1;
        }
    }
}

调用方法:

 //导出数据列 实现根据添加顺序导出列
        StarTech.NPOI.NPOIHelper.ListColumnsName = new SortedList(new StarTech.NPOI.NoSort());
        StarTech.NPOI.NPOIHelper.ListColumnsName.Add("MemberName", "姓名");
        StarTech.NPOI.NPOIHelper.ListColumnsName.Add("username", "账号");
        StarTech.NPOI.NPOIHelper.ListColumnsName.Add("starttime", "登陆时间");
        StarTech.NPOI.NPOIHelper.ListColumnsName.Add("lasttime", "在线到期时间");
        StarTech.NPOI.NPOIHelper.ListColumnsName.Add("state", "状态");
        Response.Clear();
        Response.BufferOutput = false;
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        string filename = HttpUtility.UrlEncode(DateTime.Now.ToString("在线用户yyyyMMdd"));
        Response.AddHeader("Content-Disposition", "attachment;filename=" + filename + ".xls");
        Response.ContentType = "application/ms-excel";
        StarTech.NPOI.NPOIHelper.ExportExcel(dtSource, Response.OutputStream);
        Response.Close();

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值