国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

利用NPOI組件產(chǎn)Excel完整操作

2019-11-15 02:28:22
字體:
供稿:網(wǎng)友

利用NPOI組件產(chǎn)Excel完整操作

最終還是要使用NPOi了。剛開始做的是用com組件,發(fā)現(xiàn)如果本機不按照excel就不能使用,后來把其中一支改為了用Itextsharp產(chǎn)生pdf,但是還有幾支批次要產(chǎn)生Excel,只能改用NPOI了。不過這也是一種學(xué)習(xí)了,呵呵,3種方法都用到了。

在文章開始必須先申明,我的NPOI組件版本為1.2.4

1.談?wù)勎矣玫紺om組件和NPOi組件的感覺

》NPOI不用安裝Excel,這也是我要換NPOI的主要原因

》NPOi組件產(chǎn)生Excel的速度明顯感覺比COM組件快

》NPOI對Excel的操作沒COM組件強大,可能畢竟都是微軟的東西,舉個例子,COM可以區(qū)域設(shè)置樣式等,NPOI好像只能一個單元格設(shè)置

2.使用過程

(1)怎么產(chǎn)出

          string strFileName ="my excel";//文件名稱            string strPath = AppConfigString.FilePath + strFileName+".xls";//文件完整路徑            HSSFWorkbook workbook = new HSSFWorkbook();            MemoryStream ms = new MemoryStream();            FileStream file = new FileStream(strPath, FileMode.Create);            try            {                ISheet sheet = workbook.CreateSheet(strFileName);                //write sheet here                workbook.Write(ms);                ms.WriteTo(file);                ms.Flush();            }            finally            {                ms.Close();                file.Close();            }

(2)設(shè)計產(chǎn)生的Excel

基礎(chǔ)操作一:為單元格賦值并合并單元格

                sheet.AddMergedRegion(new CellRangeAddress(0, 2, 0, 4));                IRow row = sheet.CreateRow(0);                row.HeightInPoints = (float)28.5;                ICell cell = row.CreateCell(0);                cell.SetCellValue("XXXXXX /r/n  XXXXXX");                //必須設(shè)置style.WrapText = true 時/r/n才有效                  cell.CellStyle = styleHead;

上面這段代碼的意思是:合并第1行到第3行,第1列到第5列的的單元格,并為其設(shè)置高度為28.5,然后為此合并的單元格賦值和設(shè)置樣式。

當(dāng)然也可以不合并,直接為一個單元格賦值,這時去掉第一行的代碼就ok了。注意:NPOI的行和列是從0開始的

基礎(chǔ)操作二:每列的列寬固定

由于要使報表美觀,我做的報表的列寬是固定的

                //要設(shè)置的實際列寬中加上列寬基數(shù):0.72                //sheet1.SetColumnWidth(0,  50 * 256);                  // 在EXCEL文檔中實際列寬為49.29                sheet.SetColumnWidth(0, (int)((20 + 0.72) * 256));//A                sheet.SetColumnWidth(1, (int)((25 + 0.72) * 256));//B                sheet.SetColumnWidth(2, (int)((15 + 0.72) * 256));//C

基礎(chǔ)操作三:樣式的設(shè)定

樣式的設(shè)定就有點麻煩了,每個單元格都要單獨設(shè)定樣式

              ICellStyle style = workbook.CreateCellStyle();              style.Alignment = HorizontalAlignment.CENTER;//左右居中                style.VerticalAlignment = VerticalAlignment.CENTER;//上下居中                style.WrapText = true;//自動換行                style.BorderBottom = CellBorderType.THIN;//下邊框為細(xì)線邊框                style.BorderLeft = CellBorderType.THIN;//左邊框                style.BorderRight = CellBorderType.THIN;//右邊框                style.BorderTop = CellBorderType.THIN;//上邊框                style.FillForegroundColor = HSSFColor.YELLOW.index;//背景色為黃色                style.FillPattern = FillPatternType.SOLID_FOREGROUND;//填充圖案為全色                IFont font = workbook.CreateFont();              font.FontName = "新細(xì)明體";              font.FontHeightInPoints = 12;              font.Boldweight = short.MaxValue;//加粗                style.SetFont(font);

基礎(chǔ)操作四:把DataTable的數(shù)據(jù)寫入例子

              int IBeginCount = 7;//開始寫數(shù)據(jù)的行數(shù)                int IColumnCount = 20;//數(shù)據(jù)列數(shù)                int ITotalCount = dt.Rows.Count;//表的數(shù)據(jù)行數(shù)                int IFoot = IBeginCount + ITotalCount;//開始寫頁尾的數(shù)                for (int i = IBeginCount; i < IBeginCount + ITotalCount; i++)                {                    row = sheet.CreateRow(i);                    for (int j = 0; j < IColumnCount; j++)                    {                        cell = row.CreateCell(j);                        cell.SetCellValue(dt.Rows[i - IBeginCount][j].ToString());                        if (j == 1)                        {                            cell.CellStyle = styleRed;                        }                        else                        {                            cell.CellStyle = styleTable;                        }                    }                }

上面四個操作就可以產(chǎn)生出基本的excel文件了

3.自己的一些研究

下面的都是自己的一些研究過程,有些地方還不太清楚,與大家一起學(xué)習(xí)下

自適應(yīng)寬度

博文名稱: NPOI自適應(yīng)寬度不支持中文解決方案

博文地址:http://blog.csdn.net/jerry_cool/article/details/7000085

注意:里面有個問題,單元格的寬度不能大于255,所以還要在程序里面添加

If(length>255) length=255,不然如果有數(shù)據(jù)長度過長就會報錯。

設(shè)置純色的背景顏色

為了找到這個設(shè)置,自己鼓搗了一些時間

最容易想到的肯定是要直接設(shè)置了,這樣簡單粗暴

styleYellow.FillBackgroundColor = HSSFColor.YELLOW.index;

styleYellow.FillPattern = FillPatternType.SOLID_FOREGROUND;

我設(shè)置的為黃色,但是顯示的確不是黃色,雖然有填充,但是卻是黑色。

上面的方法不ok那我就要繼續(xù)找了

看了NPOI的官方教程:NPOI 1.2.4 教程 – 2.2.6設(shè)置單元格的背景和圖案

地址:http://tonyqus.sinaapp.com/archives/169

第一步:我設(shè)置

styleYellow.FillPattern = FillPatternType.NO_FILL;

styleYellow.FillBackgroundColor = HSSFColor.YELLOW.index;

可是根本就沒有顏色,根本就沒有填充,這時就算設(shè)置了FillForegroundColor了沒用背景顏色

第二步:我隨便選了一個圖案進(jìn)行設(shè)置

styleYellow.FillForegroundColor = HSSFColor.BLACK.index;

styleYellow.FillBackgroundColor = HSSFColor.YELLOW.index;

styleYellow.FillPattern = FillPatternType.LESS_DOTS;

這時背景顏色是黃色,但是有圖案進(jìn)行干擾,值得注意的是,我不設(shè)置FillForegroundColor就沒有FillBackgroundColor這個顏色,媽蛋,這是要鬧哪樣?我只想說,我不要圖案。

最后我找到了方法

styleYellow.FillForegroundColor = HSSFColor.YELLOW.index;

styleYellow.FillPattern = FillPatternType.SOLID_FOREGROUND;

為什么是用圖案的FillForegroundColor,圖案的全是這個顏色就對了&hellip;

怎么設(shè)置行高自適應(yīng)

COM組件有個AutoFit()方法全局設(shè)置為行高自適應(yīng),但是NPOI找了很久也沒有找到,在網(wǎng)上也沒這方面的例子。但是我發(fā)現(xiàn)有時候會自動調(diào)整高度,當(dāng)設(shè)置了自動換行后,有些數(shù)據(jù)行會自動調(diào)整高度,有些則不會,但是當(dāng)我為前幾行設(shè)置高度后,就又可以自動調(diào)整高度了。不太清楚這個處理原理,求指教。

合并單元格

sheet.AddMergedRegion(new CellRangeAddress(0, 0, 6, 15));

這里不講用法,只是有個地方要注意下。

雖然合并時取的值是最左上角單元格的數(shù)據(jù),但是我設(shè)置0行6列為有下邊框,但是其他合并的單元格并沒有下邊框,說明樣式不適用,還是乖乖的每個單元格加吧。

這些就是我的一些操作,當(dāng)然NPOI還是比較博大精深的,還有待學(xué)習(xí)


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永吉县| 怀集县| 剑川县| 天津市| 丹阳市| 东兰县| 米泉市| 屯门区| 安丘市| 日喀则市| 苏尼特左旗| 祁门县| 苗栗市| 读书| 湾仔区| 万盛区| 鹤庆县| 道真| 江都市| 惠安县| 慈溪市| 蓬溪县| 西乌珠穆沁旗| 泾阳县| 武穴市| 东山县| 西吉县| 博湖县| 阿巴嘎旗| 嘉善县| 三门峡市| 龙州县| 莱芜市| 天等县| 沁阳市| 镇康县| 托克逊县| 大丰市| 肃南| 枣强县| 河津市|