天天看點

轉載 NPOI.dll 用法。單元格,樣式,字型,顔色,行高,寬度。讀寫excel

我用的版本是1.25的。每個版本用法有一點不同

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using System.IO;
using SqlHelPerXHC;
using NPOI.HSSF.Record.CF;
namespace Excl
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //http://tonyqus.sinaapp.com/page/4
        static ICellStyle Getcellstyle(IWorkbook wb, string str)
        {
            ICellStyle cellStyle = wb.CreateCellStyle();

            //字型
            IFont font12 = wb.CreateFont();
            font12.FontHeightInPoints = 10;

            font12.FontName = "微軟雅黑";

            IFont font = wb.CreateFont();
            font.FontName = "微軟雅黑";
            //font.Underline = 1;

            IFont fontcolorblue = wb.CreateFont();
            fontcolorblue.Color = HSSFColor.OLIVE_GREEN.BLUE.index;
            fontcolorblue.IsItalic = true;
            fontcolorblue.FontName = "微軟雅黑";


            //邊框
            cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.DOTTED;
            cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.HAIR;
            cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.HAIR;
            cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.DOTTED;
            //邊框顔色
            cellStyle.BottomBorderColor = HSSFColor.OLIVE_GREEN.BLUE.index;
            cellStyle.TopBorderColor = HSSFColor.OLIVE_GREEN.BLUE.index;

            //背景
            //cellStyle.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index;
            //cellStyle.FillForegroundColor = HSSFColor.OLIVE_GREEN.BLUE.index;
            cellStyle.FillForegroundColor = HSSFColor.WHITE.index;
           // cellStyle.FillPattern = FillPatternType.NO_FILL;
            cellStyle.FillBackgroundColor = HSSFColor.MAROON.index; 
            //水準對齊
            cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.LEFT;

            //垂直對齊
            cellStyle.VerticalAlignment = VerticalAlignment.CENTER;
 
            //自動換行
            cellStyle.WrapText = true;

            //縮進
            cellStyle.Indention = 0;
            switch (str)
            {
                case "頭":
                   // cellStyle.FillPattern = FillPatternType.LEAST_DOTS;
                    cellStyle.SetFont(font12);
                    break;
                case "時間":
                    IDataFormat datastyle = wb.CreateDataFormat();
                    
                    cellStyle.DataFormat = datastyle.GetFormat("yyyy/mm/dd");
                    cellStyle.SetFont(font);
                    break;
                case "數字":
                    cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
                    cellStyle.SetFont(font);
                    break;
                case "錢":
                    IDataFormat format = wb.CreateDataFormat(); 
                    cellStyle.DataFormat = format.GetFormat("¥#,##0");
                    cellStyle.SetFont(font);
                    break;
                case "url":
                    fontcolorblue.Underline = 1;
                    cellStyle.SetFont(fontcolorblue);
                    break;
                case "百分比":
                    cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
                    cellStyle.SetFont(font);
                    break;
                case "中文大寫":
                    IDataFormat format1 = wb.CreateDataFormat(); 
                    cellStyle.DataFormat = format1.GetFormat("[DbNum2][$-804]0");
                    cellStyle.SetFont(font);
                    break;
                case "科學計數法":
                    cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");
                    cellStyle.SetFont(font);
                    break;
                case "預設":
                    cellStyle.SetFont(font);
                    break;
            }
            return cellStyle;


        }
        private void btnwrite_Click(object sender, EventArgs e)
        {
            //建立資料庫
            IWorkbook wb = new HSSFWorkbook();


            //建立表
            ISheet sh = wb.CreateSheet("zhiyuan");
          //  sh.TabColorIndex = HSSFColor.RED.index;

            //設定單元的寬度
            sh.SetColumnWidth(0, 15 * 256);
            sh.SetColumnWidth(1, 35 * 256);
            sh.SetColumnWidth(2, 15 * 256);
            sh.SetColumnWidth(3, 10 * 256);

           
            

            //讀取資料庫寫入表
            string sql = "select top 100 urlnam,url,bdtim,bdsl from zhiyuan";
            int i = 0;


            //合并單元格
            sh.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 3));
            IRow row0 = sh.CreateRow(0);
            row0.Height = 20 * 20;
            ICell icell1top0 = row0.CreateCell(0);
            ICell icell1top1 = row0.CreateCell(1);
            ICell icell1top2 = row0.CreateCell(2);
            ICell icell1top3 = row0.CreateCell(3);
            icell1top0.CellStyle = Getcellstyle(wb, "頭");
            icell1top0.SetCellValue("标題合并單元");


            IRow row1 = sh.CreateRow(1);
            row1.Height = 20 * 20;

            ICell icell1top = row1.CreateCell(0);
            icell1top.CellStyle = Getcellstyle(wb, "頭");
            icell1top.SetCellValue("網站名");

            ICell icell2top = row1.CreateCell(1);
            icell2top.CellStyle = Getcellstyle(wb, "頭");
            icell2top.SetCellValue("網址");

            ICell icell3top = row1.CreateCell(2);
            icell3top.CellStyle = Getcellstyle(wb, "頭");
            icell3top.SetCellValue("百度快照");

            ICell icell4top = row1.CreateCell(3);
            icell4top.CellStyle = Getcellstyle(wb, "頭");
            icell4top.SetCellValue("百度收錄");


            i++;
            i++;
           
            using (SqlDataReader dr = SqlHelper.ExecuteReaderText(sql, null))
            {
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        IRow row = sh.CreateRow(i);
                        row.Height = 18 * 20;
                      


                        ICell icell = row.CreateCell(0);
                        icell.CellStyle = Getcellstyle(wb, "預設");
                        icell.SetCellValue(dr.GetValue(0).ToString());


                        ICell icell1 = row.CreateCell(1);
                        icell1.CellStyle = Getcellstyle(wb, "url");
                        icell1.SetCellValue(dr.GetValue(1).ToString());
                        HSSFHyperlink link = new HSSFHyperlink(HyperlinkType.URL);
                        link.Address = (dr.GetValue(1).ToString());
                        icell1.Hyperlink = (link);

                        ICell icell2 = row.CreateCell(2);
                        icell2.CellStyle = Getcellstyle(wb, "時間");
                        icell2.SetCellValue(dr.IsDBNull(2) ? Convert.ToDateTime("1990-1-1") : dr.GetDateTime(2));


                        ICell icell3 = row.CreateCell(3);
                        icell3.CellStyle = Getcellstyle(wb, "預設");
                        icell3.SetCellValue(dr.IsDBNull(3) ? 0 : dr.GetInt32(3));
                        i++;
                    }
                }
            }
            using (FileStream fs = File.OpenWrite("xxx.xls"))
            {
                wb.Write(fs);
                MessageBox.Show("Excel已經寫入成功!");
            }

        }

        private void CreateRow(IRow row, int j, SqlDataReader dr, ICellStyle cellstyle)
        {
            if (dr.GetFieldType(j).Name == "Int32")
            {


                row.CreateCell(j).SetCellValue(dr.IsDBNull(j) ? 0 : dr.GetInt32(j));
            }
            else if (dr.GetFieldType(j).Name == "Int16")
            { row.CreateCell(j).SetCellValue(dr.IsDBNull(j) ? 0 : dr.GetInt16(j)); }
            else if (dr.GetFieldType(j).Name == "Int64")
            { row.CreateCell(j).SetCellValue(dr.IsDBNull(j) ? 0 : dr.GetInt64(j)); }
            else if (dr.GetFieldType(j).Name == "String")
            { row.CreateCell(j).SetCellValue(dr.IsDBNull(j) ? "" : dr.GetString(j)); }
            else if (dr.GetFieldType(j).Name == "DateTime")
            {

                ICell cell = row.CreateCell(j);
                cell.CellStyle = cellstyle;
                cell.SetCellValue(dr.IsDBNull(j) ? Convert.ToDateTime("1990-1-1") : dr.GetDateTime(j));

            }
            else if (dr.GetFieldType(j).Name == "Double")
            { row.CreateCell(j).SetCellValue(dr.IsDBNull(j) ? 0 : dr.GetDouble(j)); }
            else if (dr.GetFieldType(j).Name == "Byte[]")
            { row.CreateCell(j).SetCellValue(dr.IsDBNull(j) ? 0 : dr.GetByte(j)); }
            else if (dr.GetFieldType(j).Name == "Decimal")
            { row.CreateCell(j).SetCellValue(dr.IsDBNull(j) ? 0 : dr.GetDouble(j)); }
            else
            {

                row.CreateCell(j).SetCellValue(dr.IsDBNull(j) ? "" : dr.GetValue(j).ToString());
            }

        }

        private void btnreade_Click(object sender, EventArgs e)
        {
            //先建立檔案流
            if (DialogResult.OK == openFileDialog1.ShowDialog())
            {
                using (FileStream fs = File.OpenRead(openFileDialog1.FileName))
                {
                    //申明資料庫對像
                    IWorkbook wk = new HSSFWorkbook(fs);

                    //擷取資料庫中的每個表
                    for (int i = 0; i < wk.NumberOfSheets; i++)
                    {
                        //申明表
                        ISheet wk1 = wk.GetSheetAt(i);

                        txtout.AppendText("====================" + wk1.SheetName + "================\r\n");

                        //擷取表的行
                        for (int j = 0; j < wk1.LastRowNum + 1; j++)
                        {
                            //申明行
                            IRow row = wk1.GetRow(j);
                            for (int k = 0; k < row.LastCellNum + 1; k++)
                            {
                                txtout.AppendText(string.Format("{0}\t", row.GetCell(k) == null ? "" : row.GetCell(k).ToString()));
                            }
                            txtout.AppendText("\r\n");
                        }
                    }

                }
            }

        }

        //把excel 轉成htm

        private void button1_Click(object sender, EventArgs e)
        {
            if (DialogResult.OK == openFileDialog1.ShowDialog())
            {
                string str = htmlxsl.Gethtmlxls(openFileDialog1.FileName);
                using (FileStream fs = File.OpenWrite("1.htm"))
                {
                    byte[] b = Encoding.Default.GetBytes(str);
                    fs.Write(b,0,b.Length);
                }
            }
        }
    }



}

 

生成htm的類 

using System.Text;
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using System.IO;
using SqlHelPerXHC;
using NPOI.HSSF.Record.CF;
namespace Excl
{
    public static class htmlxsl
    {
        private static ISheet sht;
        public static string Gethtmlxls(string path)
        {

            IWorkbook wb = new HSSFWorkbook(new FileStream(path, FileMode.Open));
            sht = wb.GetSheet("zhiyuan");
            //取行Excel的最大行數     
            int rowsCount = sht.LastRowNum;
            //為保證Table布局與Excel一樣,這裡應該取所有行中的最大列數(需要周遊整個Sheet)。     
            //為少一交全Excel周遊,提高性能,我們可以人為把第0行的列數調整至所有行中的最大列數。     
            int colsCount = sht.GetRow(0).LastCellNum;
            int colSpan;
            int rowSpan;
            bool isByRowMerged;
            StringBuilder table = new StringBuilder(rowsCount * 32);
            table.Append("<table border=\'1px\'>");
            for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)
            {
                table.Append("<tr>");
                for (int colIndex = 0; colIndex < colsCount; colIndex++)
                {
                    GetTdMergedInfo(rowIndex, colIndex, out colSpan, out rowSpan, out isByRowMerged);
                    //如果已經被行合并包含進去了就不輸出TD了。             
                    //注意被合并的行或列不輸出的處理方式不一樣,見下面一處的注釋說明了列合并後不輸出TD的處理方式。
                    if (isByRowMerged)
                    {
                        continue;
                    }
                    table.Append("<td");
                    if (colSpan > 1)
                        table.Append(string.Format(" colSpan={0}", colSpan));
                    if (rowSpan > 1)
                        table.Append(string.Format(" rowSpan={0}", rowSpan));
                    table.Append(">");
                    table.Append(sht.GetRow(rowIndex).GetCell(colIndex));
                    //列被合并之後此行将少輸出colSpan-1個TD。             
                    if (colSpan > 1)
                        colIndex += colSpan - 1;
                    table.Append("</td>");
                }
                table.Append("</tr>");
            }
            table.Append("</table>");
            return table.ToString();

        }
        /// <summary> 
        ///  擷取Table某個TD合并的列數和行數等資訊。與Excel中對應Cell的合并行數和列數一緻。 
        /// </summary> 
        /// <param name="rowIndex">行号</param> 
        /// <param name="colIndex">列号</param>
        ///  <param name="colspan">TD中需要合并的行數</param> 
        /// <param name="rowspan">TD中需要合并的列數</param> 
        /// <param name="rowspan">此單元格是否被某個行合并包含在内。如果被包含在内,将不輸出TD。</param> 
        /// <returns></returns> 
        private static void GetTdMergedInfo(int rowIndex, int colIndex, out int colspan, out int rowspan, out bool isByRowMerged)
        {
            colspan = 1;
            rowspan = 1;
            isByRowMerged = false;
            int regionsCuont = sht.NumMergedRegions;
            
            NPOI.SS.Util.CellRangeAddress region;
                
            for (int i = 0; i < regionsCuont; i++)
            {
                
                region = sht.GetMergedRegion(i);

                if (region.FirstRow == rowIndex && region.FirstColumn == colIndex)
                {
                    colspan = region.LastColumn - region.FirstColumn + 1;
                    rowspan = region.LastRow - region.FirstRow + 1;
                    return;
                }
                else if (rowIndex > region.FirstRow && rowIndex <= region.LastRow && colIndex >= region.FirstColumn && colIndex <= region.LastColumn)
                {
                    isByRowMerged = true;
                }
            }
        }
    }
}