• NPOI.dll 用法。单元格,样式,字体,颜色,行高,宽度。读写excel


    1.25 NPOI.dll
    
    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
    
        {
    
            //http://tonyqus.sinaapp.com/page/4  官网使用说明
    
            public Form1()
    
            {
    
                InitializeComponent();
    
            }
    
            #region 定义单元格常用到样式的枚举
    
            public enum stylexls
    
            {
    
                头,
    
                url,
    
                时间,
    
                数字,
    
                钱,
    
                百分比,
    
                中文大写,
    
                科学计数法,
    
                默认
    
            }
    
            #endregion
    
    
    
    
    
    
    
            #region 定义单元格常用到样式
    
            static ICellStyle Getcellstyle(IWorkbook wb, stylexls 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;
    
    
    
    
                //缩进;当设置为1时,前面留的空白太大了。希旺官网改进。或者是我设置的不对
    
                cellStyle.Indention = 0;
    
    
    
    
                //上面基本都是设共公的设置
    
                //下面列出了常用的字段类型
    
                switch (str)
    
                {
    
                    case stylexls.头:
    
                        // cellStyle.FillPattern = FillPatternType.LEAST_DOTS;
    
                        cellStyle.SetFont(font12);
    
                        break;
    
                    case stylexls.时间:
    
                        IDataFormat datastyle = wb.CreateDataFormat();
    
    
    
    
                        cellStyle.DataFormat = datastyle.GetFormat("yyyy/mm/dd");
    
                        cellStyle.SetFont(font);
    
                        break;
    
                    case stylexls.数字:
    
                        cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
    
                        cellStyle.SetFont(font);
    
                        break;
    
                    case stylexls.钱:
    
                        IDataFormat format = wb.CreateDataFormat();
    
                        cellStyle.DataFormat = format.GetFormat("¥#,##0");
    
                        cellStyle.SetFont(font);
    
                        break;
    
                    case stylexls.url:
    
                        fontcolorblue.Underline = 1;
    
                        cellStyle.SetFont(fontcolorblue);
    
                        break;
    
                    case stylexls.百分比:
    
                        cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
    
                        cellStyle.SetFont(font);
    
                        break;
    
                    case stylexls.中文大写:
    
                        IDataFormat format1 = wb.CreateDataFormat();
    
                        cellStyle.DataFormat = format1.GetFormat("[DbNum2][$-804]0");
    
                        cellStyle.SetFont(font);
    
                        break;
    
                    case stylexls.科学计数法:
    
                        cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");
    
                        cellStyle.SetFont(font);
    
                        break;
    
                    case stylexls.默认:
    
                        cellStyle.SetFont(font);
    
                        break;
    
                }
    
                return cellStyle;
    
    
    
    
    
    
    
            }
    
            #endregion
    
            
    
            //从数据库读取数据写入到excel中
    
            private void btnwrite_Click(object sender, EventArgs e)
    
            {
    
                #region 创建数据库,表,设置单元的宽度
    
                //创建数据库
    
                IWorkbook wb = new HSSFWorkbook();
    
    
    
    
    
    
    
    
    
    
                //创建表
    
                ISheet sh = wb.CreateSheet("zhiyuan");
    
               
    
    
    
    
                //设置单元的宽度
    
                sh.SetColumnWidth(0, 15 * 256);
    
                sh.SetColumnWidth(1, 35 * 256);
    
                sh.SetColumnWidth(2, 15 * 256);
    
                sh.SetColumnWidth(3, 10 * 256);
    
                #endregion
    
    
    
    
    
    
    
                int i = 0;
    
    
    
    
    
    
    
                #region 练习合并单元格 
    
                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, stylexls.头);
    
                icell1top0.SetCellValue("标题合并单元");
    
                #endregion
    
    
    
    
                i++;
    
    
    
    
                #region 设置表头
    
                IRow row1 = sh.CreateRow(1);
    
                row1.Height = 20 * 20;
    
    
    
    
                ICell icell1top = row1.CreateCell(0);
    
                icell1top.CellStyle = Getcellstyle(wb, stylexls.头);
    
                icell1top.SetCellValue("网站名");
    
    
    
    
                ICell icell2top = row1.CreateCell(1);
    
                icell2top.CellStyle = Getcellstyle(wb, stylexls.头);
    
                icell2top.SetCellValue("网址");
    
    
    
    
                ICell icell3top = row1.CreateCell(2);
    
                icell3top.CellStyle = Getcellstyle(wb, stylexls.头);
    
                icell3top.SetCellValue("百度快照");
    
    
    
    
                ICell icell4top = row1.CreateCell(3);
    
                icell4top.CellStyle = Getcellstyle(wb, stylexls.头);
    
                icell4top.SetCellValue("百度收录");
    
                #endregion
    
    
    
    
                i++;
    
    
    
    
                #region 读取数据库写入表
    
                string sql = "select top 100 urlnam,url,bdtim,bdsl from zhiyuan";
    
                using (SqlDataReader dr = SqlHelper.ExecuteReaderText(sql, null))
    
                {
    
                    if (dr.HasRows)
    
                    {
    
                        while (dr.Read())
    
                        {
    
                            //创建行
    
                            IRow row = sh.CreateRow(i);
    
                            row.Height = 18 * 20;
    
    
    
    
    
    
    
                            //创建第1列
    
                            ICell icell = row.CreateCell(0);
    
                            icell.CellStyle = Getcellstyle(wb, stylexls.默认);
    
                            icell.SetCellValue(dr.GetValue(0).ToString());
    
    
    
    
    
    
    
                            //创建第2列
    
                            ICell icell1 = row.CreateCell(1);
    
                            icell1.CellStyle = Getcellstyle(wb, stylexls.url);
    
                            icell1.SetCellValue(dr.GetValue(1).ToString());
    
                            HSSFHyperlink link = new HSSFHyperlink(HyperlinkType.URL);
    
                            link.Address = (dr.GetValue(1).ToString());
    
                            icell1.Hyperlink = (link);
    
    
    
    
                            //创建第3列
    
                            ICell icell2 = row.CreateCell(2);
    
                            icell2.CellStyle = Getcellstyle(wb, stylexls.时间);
    
                            icell2.SetCellValue(dr.IsDBNull(2) ? Convert.ToDateTime("1990-1-1") : dr.GetDateTime(2));
    
    
    
    
                            //创建第4列
    
                            ICell icell3 = row.CreateCell(3);
    
                            icell3.CellStyle = Getcellstyle(wb, stylexls.默认);
    
                            icell3.SetCellValue(dr.IsDBNull(3) ? 0 : dr.GetInt32(3));
    
                            i++;
    
                        }
    
                    }
    
                }
    
                #endregion
    
               
    
                
    
                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());
    
                }
    
    
    
    
            }
    
    
    
    
            #region 读取excel
    
            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 + "================
    ");
    
    
    
    
                            //获取表的行
    
                            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}	", row.GetCell(k) == null ? "" : row.GetCell(k).ToString()));
    
                                }
    
                                txtout.AppendText("
    ");
    
                            }
    
                        }
    
    
    
    
                    }
    
                }
    
    
    
    
            }
    
            #endregion
    
    
    
    
    
    
    
            #region 把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);
    
                    }
    
                }
    
            }
    
            #endregion
    
            
    
        }
    
    }
    
    
    
    生成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;
    
                    }
    
                }
    
            }
    
        }
    
    }
  • 相关阅读:
    2019-2020-1学期 20192426 《网络空间安全导论》第九周学习总结
    2019-2020-1学期 20192426 《网络空间安全导论》第八周学习总结
    2019-2020-1学期 20192426 《网络空间安全导论》第七周学习总结
    2019-2020-1学期 20192426 《网络空间安全导论》第六周学习总结
    2019-2020-1学期 20192426 《网络空间安全导论》第五周学习总结
    2019-2020-1学期 20192426 《网络空间安全导论》第四周学习总结
    2019-2020-1学期 20192426 《网络空间安全导论》第三周学习总结
    2019-2020-1学期 20192426 《网络空间安全导论》第二周学习总结
    1924班小组讨论 组员:袁浩然 公凯文 张纹豪 马一 张家华
    20192414 2019-2020-1学期 《网络空间安全导论》第九周学习报告
  • 原文地址:https://www.cnblogs.com/sidecore/p/6002057.html
Copyright © 2020-2023  润新知