国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) php教程 php手冊(cè) 分享我基于NPOI+ExcelReport實(shí)現(xiàn)的導(dǎo)入與導(dǎo)出EXCEL類(lèi)庫(kù):ExcelUt

分享我基于NPOI+ExcelReport實(shí)現(xiàn)的導(dǎo)入與導(dǎo)出EXCEL類(lèi)庫(kù):ExcelUt

Jul 06, 2016 pm 01:30 PM
分享 基于 實(shí)現(xiàn) 導(dǎo)入

自ExcelUtility類(lèi)推出以來(lái),經(jīng)過(guò)項(xiàng)目中的實(shí)際使用與不斷完善,現(xiàn)在又做了許多的優(yōu)化并增加了許多的功能,本篇不再講述原理,直接貼出示例代碼以及相關(guān)的模板、結(jié)果圖,以便大家快速掌握,另外這些示例說(shuō)明我也已同步到GIT中,大家可以下載與學(xué)習(xí),不足之處,

自ExcelUtility類(lèi)推出以來(lái),經(jīng)過(guò)項(xiàng)目中的實(shí)際使用與不斷完善,現(xiàn)在又做了許多的優(yōu)化并增加了許多的功能,本篇不再講述原理,直接貼出示例代碼以及相關(guān)的模板、結(jié)果圖,以便大家快速掌握,另外這些示例說(shuō)明我也已同步到GIT中,大家可以下載與學(xué)習(xí),不足之處,敬請(qǐng)見(jiàn)諒,謝謝!

一、ExcelUtility類(lèi)庫(kù)操作說(shuō)明(模板導(dǎo)出示例)

1.

        /// <summary>
        /// 測(cè)試方法:測(cè)試依據(jù)模板+DataTable來(lái)生成EXCEL
        /// </summary>
        [TestMethod]
        public void TestExportToExcelWithTemplateByDataTable()
        {
            DataTable dt = GetDataTable();//獲取數(shù)據(jù)
            string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel.xlsx"; //獲得EXCEL模板路徑
            SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //實(shí)例化一個(gè)模板數(shù)據(jù)格式化容器

            PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();//實(shí)例化一個(gè)局部元素格式化器
            partFormatterBuilder.AddFormatter("Title", "跨越IT學(xué)員");//將模板表格中Title的值設(shè)置為跨越IT學(xué)員
            formatterContainers.AppendFormatterBuilder(partFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            CellFormatterBuilder cellFormatterBuilder = new CellFormatterBuilder();//實(shí)例化一個(gè)單元格格式化器
            cellFormatterBuilder.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//將模板表格中rptdate的值設(shè)置為當(dāng)前日期
            formatterContainers.AppendFormatterBuilder(cellFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            //實(shí)例化一個(gè)表格格式化器,dt.Select()是將DataTable轉(zhuǎn)換成DataRow[],name表示的模板表格中第一行第一個(gè)單元格要填充的數(shù)據(jù)參數(shù)名
            TableFormatterBuilder<DataRow> tableFormatterBuilder = new TableFormatterBuilder<DataRow>(dt.Select(), "name");
            tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{
                {"name",r=>r["Col1"]},//將模板表格中name對(duì)應(yīng)DataTable中的列Col1
                {"sex",r=>r["Col2"]},//將模板表格中sex對(duì)應(yīng)DataTable中的列Col2
                {"km",r=>r["Col3"]},//將模板表格中km對(duì)應(yīng)DataTable中的列Col3
                {"score",r=>r["Col4"]},//將模板表格中score對(duì)應(yīng)DataTable中的列Col4
                {"result",r=>r["Col5"]}//將模板表格中result對(duì)應(yīng)DataTable中的列Co5
            });
            formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效
            string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "table", formatterContainers);
            Assert.IsTrue(File.Exists(excelPath));
        }

模板如下:

導(dǎo)出結(jié)果如下:

2.

        /// <summary>
        /// 測(cè)試方法:測(cè)試依據(jù)模板+List來(lái)生成EXCEL
        /// </summary>
        [TestMethod]
        public void TestExportToExcelWithTemplateByList()
        {
            List<Student> studentList = GetStudentList();//獲取數(shù)據(jù)
            string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel.xlsx"; //獲得EXCEL模板路徑
            SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //實(shí)例化一個(gè)模板數(shù)據(jù)格式化容器

            PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();//實(shí)例化一個(gè)局部元素格式化器
            partFormatterBuilder.AddFormatter("Title", "跨越IT學(xué)員");//將模板表格中Title的值設(shè)置為跨越IT學(xué)員
            formatterContainers.AppendFormatterBuilder(partFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            CellFormatterBuilder cellFormatterBuilder = new CellFormatterBuilder();//實(shí)例化一個(gè)單元格格式化器
            cellFormatterBuilder.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//將模板表格中rptdate的值設(shè)置為當(dāng)前日期
            formatterContainers.AppendFormatterBuilder(cellFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            //實(shí)例化一個(gè)表格格式化器,studentList本身就是可枚舉的無(wú)需轉(zhuǎn)換,name表示的模板表格中第一行第一個(gè)單元格要填充的數(shù)據(jù)參數(shù)名
            TableFormatterBuilder<Student> tableFormatterBuilder = new TableFormatterBuilder<Student>(studentList, "name");
            tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<Student, object>>{
                {"name",r=>r.Name},//將模板表格中name對(duì)應(yīng)Student對(duì)象中的屬性Name
                {"sex",r=>r.Sex},//將模板表格中sex對(duì)應(yīng)Student對(duì)象中的屬性Sex
                {"km",r=>r.KM},//將模板表格中km對(duì)應(yīng)Student對(duì)象中的屬性KM
                {"score",r=>r.Score},//將模板表格中score對(duì)應(yīng)Student對(duì)象中的屬性Score
                {"result",r=>r.Result}//將模板表格中result對(duì)應(yīng)Student對(duì)象中的屬性Result
            });
            formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);

            string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "table", formatterContainers);
            Assert.IsTrue(File.Exists(excelPath));

        }

模板同上一個(gè)模板

導(dǎo)出結(jié)果如下:

3.

        /// <summary>
        /// 測(cè)試方法:測(cè)試依據(jù)模板+DataTable來(lái)生成多表格EXCEL(注意:由于ExcelReport框架限制,目前僅支持模板文件格式為:xls)
        /// </summary>
        [TestMethod]
        public void TestExportToRepeaterExcelWithTemplateByDataTable()
        {
            DataTable dt = GetDataTable();//獲取數(shù)據(jù)
            string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel2.xls"; //獲得EXCEL模板路徑
            SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //實(shí)例化一個(gè)模板數(shù)據(jù)格式化容器

            //實(shí)例化一個(gè)可重復(fù)表格格式化器,dt.Select()是將DataTable轉(zhuǎn)換成DataRow[],rpt_begin表示的模板表格開(kāi)始位置參數(shù)名,rpt_end表示的模板表格結(jié)束位置參數(shù)名
            RepeaterFormatterBuilder<DataRow> tableFormatterBuilder = new RepeaterFormatterBuilder<DataRow>(dt.Select(), "rpt_begin", "rpt_end");
            tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{
                {"sex",r=>r["Col2"]},//將模板表格中sex對(duì)應(yīng)DataTable中的列Col2
                {"km",r=>r["Col3"]},//將模板表格中km對(duì)應(yīng)DataTable中的列Col3
                {"score",r=>r["Col4"]},//將模板表格中score對(duì)應(yīng)DataTable中的列Col4
                {"result",r=>r["Col5"]}//將模板表格中result對(duì)應(yīng)DataTable中的列Co5
            });

            PartFormatterBuilder<DataRow> partFormatterBuilder2 = new PartFormatterBuilder<DataRow>();//實(shí)例化一個(gè)可嵌套的局部元素格式化器
            partFormatterBuilder2.AddFormatter("name", r => r["Col1"]);//將模板表格中name對(duì)應(yīng)DataTable中的列Col1
            tableFormatterBuilder.AppendFormatterBuilder(partFormatterBuilder2);//添加到可重復(fù)表格格式化器中,作為其子格式化器


            CellFormatterBuilder<DataRow> cellFormatterBuilder = new CellFormatterBuilder<DataRow>();//實(shí)例化一個(gè)可嵌套的單元格格式化器
            cellFormatterBuilder.AddFormatter("rptdate", r => DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//將模板表格中rptdate的值設(shè)置為當(dāng)前日期
            tableFormatterBuilder.AppendFormatterBuilder(cellFormatterBuilder);//添加到可重復(fù)表格格式化器中,作為其子格式化器

            formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "multtable", formatterContainers);
            Assert.IsTrue(File.Exists(excelPath));
        }

模板如下:

導(dǎo)出結(jié)果如下:

4.

        /// <summary>
        /// 測(cè)試方法:測(cè)試依據(jù)復(fù)雜模板(含固定表格,可重復(fù)表格)+DataTable來(lái)生成EXCEL (注意:由于ExcelReport框架限制,目前僅支持模板文件格式為:xls)
        /// </summary>
        [TestMethod]
        public void TestExportToExcelWithTemplateByList2()
        {
            var schoolLevelList = SchoolLevel.GetList();
            var classList = ClassInfo.GetList();
            string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb.xls"; //獲得EXCEL模板路徑
            SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //實(shí)例化一個(gè)模板數(shù)據(jù)格式化容器

            PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();
            partFormatterBuilder.AddFormatter("school", "跨越小學(xué)");
            formatterContainers.AppendFormatterBuilder(partFormatterBuilder);

            TableFormatterBuilder<SchoolLevel> tableFormatterBuilder = new TableFormatterBuilder<SchoolLevel>(schoolLevelList, "lv");//實(shí)例化一個(gè)表格格式化器
            tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<SchoolLevel, object>>
            {
                {"lv",r=>r.LevelName}, //模板參數(shù)與數(shù)據(jù)源SchoolLevel屬性對(duì)應(yīng)關(guān)系,下同
                {"clscount",r=>r.ClassCount},
                {"lvmaster",r=>r.Master}
            });
            formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            RepeaterFormatterBuilder<ClassInfo> repeaterFormatterBuilder = new RepeaterFormatterBuilder<ClassInfo>(classList, "lv_begin", "lv_end");//實(shí)例化一個(gè)可重復(fù)表格格式化器
            repeaterFormatterBuilder.AddFormatters(new Dictionary<string, Func<ClassInfo, object>> { 
                {"class",r=>r.ClassName}, //模板參數(shù)與數(shù)據(jù)源ClassInfo屬性對(duì)應(yīng)關(guān)系,下同
                {"stucount",r=>r.StudentCount},
                {"clsmaster",r=>r.Master},
                {"lvitem",r=>r.LevelName}
            });
            formatterContainers.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "school", formatterContainers);
            Assert.IsTrue(File.Exists(excelPath));

        }

模板如下:

導(dǎo)出結(jié)果如下:

5.

        /// <summary>
        /// 測(cè)試方法:測(cè)試依據(jù)復(fù)雜模板(含固定表格,可重復(fù)表格中嵌套表格)+DataTable來(lái)生成EXCEL (注意:由于ExcelReport框架限制,目前僅支持模板文件格式為:xls)
        /// </summary>
        [TestMethod]
        public void TestExportToExcelWithTemplateByList3()
        {
            var schoolLevelList = SchoolLevel.GetList();
            var classList = ClassInfo.GetListWithLevels();

            string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb1.xls"; //獲得EXCEL模板路徑
            SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //實(shí)例化一個(gè)模板數(shù)據(jù)格式化容器

            PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();
            partFormatterBuilder.AddFormatter("school", "跨越小學(xué)");
            formatterContainers.AppendFormatterBuilder(partFormatterBuilder);

            TableFormatterBuilder<SchoolLevel> tableFormatterBuilder = new TableFormatterBuilder<SchoolLevel>(schoolLevelList, "lv");//實(shí)例化一個(gè)表格格式化器
            tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<SchoolLevel, object>>
            {
                {"lv",r=>r.LevelName}, //模板參數(shù)與數(shù)據(jù)源SchoolLevel屬性對(duì)應(yīng)關(guān)系,下同
                {"clscount",r=>r.ClassCount},
                {"lvmaster",r=>r.Master}
            });
            formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            RepeaterFormatterBuilder<KeyValuePair<string, List<ClassInfo>>> repeaterFormatterBuilder = new RepeaterFormatterBuilder<KeyValuePair<string, List<ClassInfo>>>(classList, "lv_begin", "lv_end");
            repeaterFormatterBuilder.AddFormatter("lvitem",r=>r.Key);

             TableFormatterBuilder<KeyValuePair<string, List<ClassInfo>>,ClassInfo> tableFormatterBuilder2=new TableFormatterBuilder<KeyValuePair<string, List<ClassInfo>>,ClassInfo>(r=>r.Value,"class");
            tableFormatterBuilder2.AddFormatter("class",r=>r.ClassName);
            tableFormatterBuilder2.AddFormatter("stucount",r=>r.StudentCount);
            tableFormatterBuilder2.AddFormatter("clsmaster",r=>r.Master);

            repeaterFormatterBuilder.AppendFormatterBuilder(tableFormatterBuilder2);

            formatterContainers.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "school", formatterContainers);
            Assert.IsTrue(File.Exists(excelPath));

        }

模板如下:

導(dǎo)出結(jié)果如下:

6.

        /// <summary>
        /// 測(cè)試方法:測(cè)試依據(jù)復(fù)雜模板(多工作薄,且含固定表格,可重復(fù)表格)+DataSet來(lái)生成EXCEL,只支持XLS
        /// </summary>
        [TestMethod]
        public void TestExportToExcelWithTemplateByDataSet()
        {
            var ds = GetDataSet();
            string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb2.xls"; //獲得EXCEL模板路徑
            Dictionary<string, SheetFormatterContainer> formatterContainerDic = new Dictionary<string, SheetFormatterContainer>(); //實(shí)例化一個(gè)模板數(shù)據(jù)格式化容器數(shù)組,包含兩個(gè)SheetFormatterContainer用于格式化兩個(gè)工作薄


            #region 創(chuàng)建第一個(gè)工作薄格式化容器,并設(shè)置相關(guān)參數(shù)對(duì)應(yīng)關(guān)系

            SheetFormatterContainer formatterContainer1 = new SheetFormatterContainer();

            PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();
            partFormatterBuilder.AddFormatter("school", "跨越小學(xué)");
            formatterContainer1.AppendFormatterBuilder(partFormatterBuilder);

            TableFormatterBuilder<DataRow> tableFormatterBuilder = new TableFormatterBuilder<DataRow>(ds.Tables[0].Select(), "lv");//實(shí)例化一個(gè)表格格式化器
            tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>
            {
                {"lv",r=>r["Col1"]}, //模板參數(shù)與數(shù)據(jù)源DataTable屬性對(duì)應(yīng)關(guān)系,下同
                {"clscount",r=>r["Col2"]},
                {"lvmaster",r=>r["Col3"]}
            });
            formatterContainer1.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            RepeaterFormatterBuilder<DataRow> repeaterFormatterBuilder = new RepeaterFormatterBuilder<DataRow>(ds.Tables[1].Select(), "lv_begin", "lv_end");//實(shí)例化一個(gè)可重復(fù)表格格式化器
            repeaterFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>> { 
                {"class",r=>r["Col1"]}, //模板參數(shù)與數(shù)據(jù)源ClassInfo屬性對(duì)應(yīng)關(guān)系,下同
                {"stucount",r=>r["Col2"]},
                {"clsmaster",r=>r["Col3"]},
                {"lvitem",r=>r["Col4"]}
            });
            formatterContainer1.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            formatterContainerDic.Add("table1", formatterContainer1);//添加到工作薄格式容器數(shù)組中,注意此處的Key值為模板上工作薄的名稱(chēng),此處即為:table1

            #endregion


            #region 創(chuàng)建第二個(gè)工作薄格式化容器,并設(shè)置相關(guān)參數(shù)對(duì)應(yīng)關(guān)系

            SheetFormatterContainer formatterContainer2 = new SheetFormatterContainer(); //實(shí)例化一個(gè)模板數(shù)據(jù)格式化容器

            PartFormatterBuilder partFormatterBuilder2 = new PartFormatterBuilder();//實(shí)例化一個(gè)局部元素格式化器
            partFormatterBuilder2.AddFormatter("Title", "跨越IT學(xué)員");//將模板表格中Title的值設(shè)置為跨越IT學(xué)員
            formatterContainer2.AppendFormatterBuilder(partFormatterBuilder2);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            CellFormatterBuilder cellFormatterBuilder2 = new CellFormatterBuilder();//實(shí)例化一個(gè)單元格格式化器
            cellFormatterBuilder2.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//將模板表格中rptdate的值設(shè)置為當(dāng)前日期
            formatterContainer2.AppendFormatterBuilder(cellFormatterBuilder2);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            //實(shí)例化一個(gè)表格格式化器,dt.Select()是將DataTable轉(zhuǎn)換成DataRow[],name表示的模板表格中第一行第一個(gè)單元格要填充的數(shù)據(jù)參數(shù)名
            TableFormatterBuilder<DataRow> tableFormatterBuilder2 = new TableFormatterBuilder<DataRow>(ds.Tables[2].Select(), "name");
            tableFormatterBuilder2.AddFormatters(new Dictionary<string, Func<DataRow, object>>{
                {"name",r=>r["Col1"]},//將模板表格中name對(duì)應(yīng)DataTable中的列Col1
                {"sex",r=>r["Col2"]},//將模板表格中sex對(duì)應(yīng)DataTable中的列Col2
                {"km",r=>r["Col3"]},//將模板表格中km對(duì)應(yīng)DataTable中的列Col3
                {"score",r=>r["Col4"]},//將模板表格中score對(duì)應(yīng)DataTable中的列Col4
                {"result",r=>r["Col5"]}//將模板表格中result對(duì)應(yīng)DataTable中的列Co5
            });
            formatterContainer2.AppendFormatterBuilder(tableFormatterBuilder2);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            formatterContainerDic.Add("table2", formatterContainer2);//添加到工作薄格式容器數(shù)組中,注意此處的Key值為模板上工作薄的名稱(chēng),此處即為:table2

            #endregion

            string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, formatterContainerDic);
            Assert.IsTrue(File.Exists(excelPath));

        }

模板如下:

導(dǎo)出結(jié)果如下:

二、ExcelUtility類(lèi)庫(kù)操作說(shuō)明(嵌入圖片示例)

一、 制作模板(含圖片)
1. 制作模板的文件格式需為兼容格式,即:xls或xlt;
2. 模板變量(或稱(chēng)為占位符)定義與之前相同,即:$[變量名];
3. 圖片變量定義如下:
a) 繪制一個(gè)圖形,圖形形狀盡可能的與要顯示的圖片相同,比如:印章,則可繪制一個(gè)圓形;
b) 圖形必需是透明背景,邊框可要可不要,建議留著,這樣后續(xù)調(diào)整比較方便,如下圖中的藍(lán)色透明背景圓形:

c) 圖形大小盡可能與要顯示的圖片大小相同,如下圖示:

由于EXCEL上大小默認(rèn)采用厘米,而圖片一般采用像素,所以需要自己換算一下像素對(duì)應(yīng)的厘米數(shù)(也可將EXCEL計(jì)算單位設(shè)為像素,方法自行網(wǎng)上查找);也可網(wǎng)上下載單位轉(zhuǎn)換工具
另外圖形屬性建議設(shè)置成如下圖:

溫馨提示:圖形形狀、屬性若未設(shè)置一般不影響導(dǎo)出效果,但不排除其它異常情況,圖形大小是一定要設(shè)置,且盡可能與要顯示圖形大?。ǜ摺挘┫嗤?,否則有可能造成導(dǎo)出變形

代碼示例:

    /// <summary>
        /// 測(cè)試方法:測(cè)試依據(jù)模板+DataTable+圖片來(lái)生成包含圖片的EXCEL,只支持XLS
        /// </summary>
        [TestMethod]
        public void TestInsertPic()
        {
            DataTable dt = GetDataTable();//獲取數(shù)據(jù)
            string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel.xls"; //獲得EXCEL模板路徑
            SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //實(shí)例化一個(gè)模板數(shù)據(jù)格式化容器


            PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();//實(shí)例化一個(gè)局部元素格式化器
            partFormatterBuilder.AddFormatter("Title", "跨越IT學(xué)員");//將模板表格中Title的值設(shè)置為跨越IT學(xué)員d
            formatterContainers.AppendFormatterBuilder(partFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            CellFormatterBuilder cellFormatterBuilder = new CellFormatterBuilder();//實(shí)例化一個(gè)單元格格式化器
            cellFormatterBuilder.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//將模板表格中rptdate的值設(shè)置為當(dāng)前日期
            formatterContainers.AppendFormatterBuilder(cellFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效

            //實(shí)例化一個(gè)表格格式化器,dt.Select()是將DataTable轉(zhuǎn)換成DataRow[],name表示的模板表格中第一行第一個(gè)單元格要填充的數(shù)據(jù)參數(shù)名
            TableFormatterBuilder<DataRow> tableFormatterBuilder = new TableFormatterBuilder<DataRow>(dt.Select(), "name");
            tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{
                {"name",r=>r["Col1"]},//將模板表格中name對(duì)應(yīng)DataTable中的列Col1
                {"sex",r=>r["Col2"]},//將模板表格中sex對(duì)應(yīng)DataTable中的列Col2
                {"km",r=>r["Col3"]},//將模板表格中km對(duì)應(yīng)DataTable中的列Col3
                {"score",r=>r["Col4"]},//將模板表格中score對(duì)應(yīng)DataTable中的列Col4
                {"result",r=>r["Col5"]}//將模板表格中result對(duì)應(yīng)DataTable中的列Co5
            });
            formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加進(jìn)去了才會(huì)生效


            string picPath = AppDomain.CurrentDomain.BaseDirectory + "\\tz.png";//圖片路徑
            PictureWithShapeFormatterBuilder pictureBuilder = new PictureWithShapeFormatterBuilder();//實(shí)例化一個(gè)圖片關(guān)聯(lián)圖形格式化器
            //pictureBuilder.AddFormatter(picPath);//當(dāng)sheet中只有一個(gè)圖形時(shí),我們可以省略指定區(qū)域,那么默認(rèn)就是把整個(gè)工作薄區(qū)域當(dāng)成一個(gè)尋找圖形區(qū)域,若sheet中包含多個(gè),則應(yīng)指定區(qū)域,替換成如下語(yǔ)句
            pictureBuilder.AddFormatter(picPath,5,60000, 0, 3, false);//第一個(gè)參數(shù)為圖片路徑,中間4個(gè)參數(shù)為數(shù)字型指定圖形尋找的工作薄區(qū)域(行索引,列索引,索引從0開(kāi)始計(jì)),最后一個(gè)為是否自適應(yīng)大小,一般不建議使用,除非壓縮圖片
            formatterContainers.AppendFormatterBuilder(pictureBuilder);

            string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "table", formatterContainers);
            Assert.IsTrue(File.Exists(excelPath));
        }

模板如下:

注意圖片若需要為透明背景格式,則必需使用PNG格式,NPOI支持的圖片主要格式有:PNG,JPG

導(dǎo)出結(jié)果如下:

溫馨提示:
pictureBuilder.AddFormatter(picPath);//當(dāng)sheet中只有一個(gè)圖形時(shí),我們可以省略指定區(qū)域,那么默認(rèn)就是把整個(gè)工作薄區(qū)域當(dāng)成一個(gè)尋找圖形區(qū)域,若sheet中包含多個(gè),則應(yīng)指定區(qū)域,替換成如下語(yǔ)句
pictureBuilder.AddFormatter(picPath,5,60000, 0, 3, false);//第一個(gè)參數(shù)為圖片路徑,中間4個(gè)參數(shù)為數(shù)字型指定圖形尋找的工作薄區(qū)域(行索引(起止),列索引(起止),索引從0開(kāi)始計(jì)),最后一個(gè)為是否自適應(yīng)大小,一般不建議使用,除非壓縮圖片


如果圖形可能隨單元格進(jìn)行位置調(diào)整,那么在指定圖形區(qū)域時(shí)需注意,如果圖形會(huì)隨單元格下移,那么結(jié)束行索引(MinRow)就需要指定一個(gè)可能的最大值或不指定,如果圖形會(huì)隨單元格右移,那么結(jié)束列索引(MinColumn)就需要指定一個(gè)可能的最大值或不指定,如果存在多個(gè)圖形區(qū)域,則上述情況都必需給定具體值(可能的最大值),以免造成區(qū)域交叉,從而導(dǎo)致圖片顯示不正確,如下示例:

//圖形可能下移,可能右移,那么將結(jié)束行設(shè)為可能最大值:60000,結(jié)束列設(shè)為可能最大值:255
pictureBuilder.AddFormatter(picPath, 5, 60000, 0, 255, false);

//此處只指定開(kāi)始行與開(kāi)始列,與上面差不多,但建議使用上面的用法
pictureBuilder.AddFormatter(new PictureWithShapeInfo(picPath, new SheetRange() {MinRow=5,MinColumn=0 },false));

特別說(shuō)明:

1.本類(lèi)庫(kù)是基于NPOI+ExcelReport,所有功能凡我的類(lèi)庫(kù)能夠?qū)崿F(xiàn)的,NPOI與ExcelReport都可以實(shí)現(xiàn),只是用法及復(fù)雜程度不同而矣,我封裝的目的就是為了降低大家的學(xué)習(xí)難度,提高使用效率,免費(fèi)且開(kāi)源,源代碼同步更新至開(kāi)源社區(qū)的GIT目錄中,具體地址請(qǐng)看我該系列之前的文章有列出,在此就不再說(shuō)明。

2.上述圖片關(guān)聯(lián)圖形顯示功能我是在ExcelReport基礎(chǔ)上增加了一個(gè)PictureWithShapeFormatter類(lèi)及其相關(guān)的類(lèi):PictureWithShapeInfo、SheetRange,因沒(méi)有關(guān)聯(lián)GIT,所以是在本地更新的,這幾個(gè)類(lèi)的代碼如下:

PictureWithShapeFormatter:

using NPOI.Extend;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ExcelReport
{
    public class PictureWithShapeFormatter : ElementFormatter
    {
        PRivate PictureWithShapeInfo PictureInfo = null;

        public PictureWithShapeFormatter(PictureWithShapeInfo pictureInfo)
        {
            this.PictureInfo = pictureInfo;
        }


        public override void Format(SheetAdapter sheetAdapter)
        {
            var sheet = sheetAdapter.CurrentSheet;
            var shapes = PictureInfo.GetShapes(sheet);
            bool isCompatible = false;
            if (sheet is HSSFSheet)
            {
                isCompatible = true;
            }

            if (shapes == null || shapes.Count <= 0)
            {
                throw new Exception(string.Format("未能獲取到工作薄[{0}]指定區(qū)域的圖形對(duì)象列表!", sheet.SheetName));
            }

            byte[] bytes = System.IO.File.ReadAllBytes(PictureInfo.FilePath);
            int pictureIdx = -1;
            IDrawing drawing = null;
            IClientAnchor anchor = null;
            if (isCompatible)
            {
                var shape = shapes[0] as HSSFShape;
                anchor = shape.Anchor as IClientAnchor;
                drawing = shape.Patriarch;
                shape.LineStyle = LineStyle.None;
            }
            else
            {
                var shape = shapes[0] as XSSFShape;
                anchor = shape.GetAnchor() as IClientAnchor;
                drawing = shape.GetDrawing();
                shape.LineStyle = LineStyle.None;
            }

            pictureIdx = sheet.Workbook.AddPicture(bytes, PictureInfo.PictureType);
            var picture = drawing.CreatePicture(anchor, pictureIdx);
            if (PictureInfo.AutoSize)
            {
                picture.Resize();
            }
        }


    }
}

PictureWithShapeInfo、SheetRange:

using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.Extend;

namespace ExcelReport
{
    /// <summary>
    /// 圖片關(guān)聯(lián)圖形信息
    /// 作者:Zuowenjun
    /// </summary>
    public class PictureWithShapeInfo
    {
        private SheetRange _SheetRange = new SheetRange();

        public string FilePath { get; set; }

        public PictureType PictureType { get; set; }

        public SheetRange ShapeRange
        {
            get { return _SheetRange; }
            set
            {
                if (value != null)
                {
                    _SheetRange = value;
                }
            }
        }

        public bool AutoSize { get; set; }

        public PictureWithShapeInfo()
        { }

        public PictureWithShapeInfo(string filePath, SheetRange shapeRange = null, bool autoSize = false)
        {
            this.FilePath = filePath;
            this.ShapeRange = shapeRange;
            this.AutoSize = autoSize;
            this.PictureType = GetPictureType(filePath);
        }


        public List<object> GetShapes(ISheet sheet)
        {
            List<object> shapeAllList = new List<object>();
            var shapeContainer = sheet.DrawingPatriarch;
            if (sheet is HSSFSheet)
            {
                var shapeContainerHSSF = sheet.DrawingPatriarch as HSSFShapeContainer;
                if (null != shapeContainer)
                {
                    var shapeList = shapeContainerHSSF.Children;
                    foreach (var shape in shapeList)
                    {
                        if (shape is HSSFShape && shape.Anchor is HSSFClientAnchor)
                        {
                            var anchor = shape.Anchor as HSSFClientAnchor;
                            if (IsInternalOrIntersect(ShapeRange.MinRow, ShapeRange.MaxRow, ShapeRange.MinColumn, ShapeRange.MaxColumn, anchor.Row1, anchor.Row2, anchor.Col1, anchor.Col2, true))
                            {
                                shapeAllList.Add(shape);
                            }
                        }
                    }
                }
            }
            else
            {
                var documentPartList = (sheet as XSSFSheet).GetRelations();
                foreach (var documentPart in documentPartList)
                {
                    if (documentPart is XSSFDrawing)
                    {
                        var drawing = (XSSFDrawing)documentPart;
                        var shapeList = drawing.GetShapes();
                        foreach (var shape in shapeList)
                        {
                            var anchorResult = shape.GetAnchor();
                            if (shape is XSSFShape && anchorResult is XSSFClientAnchor)
                            {
                                var anchor = anchorResult as XSSFClientAnchor;
                                if (IsInternalOrIntersect(ShapeRange.MinRow, ShapeRange.MaxRow, ShapeRange.MinColumn, ShapeRange.MaxColumn, anchor.Row1, anchor.Row2, anchor.Col1, anchor.Col2, true))
                                {
                                    shapeAllList.Add(shape);
                                }
                            }
                        }
                    }
                }
            }

            return shapeAllList;
        }


        private PictureType GetPictureType(string filePath)
        {
            string ext = Path.GetExtension(filePath).ToUpper();
            switch (ext)
            {
                case ".JPG": { return PictureType.JPEG; }
                case ".PNG": { return PictureType.PNG; }
                default: { return PictureType.None; }
            }
        }

        private bool IsInternalOrIntersect(int? rangeMinRow, int? rangeMaxRow, int? rangeMinCol, int? rangeMaxCol,
                                        int pictureMinRow, int pictureMaxRow, int pictureMinCol, int pictureMaxCol, bool onlyInternal)
        {
            int _rangeMinRow = rangeMinRow ?? pictureMinRow;
            int _rangeMaxRow = rangeMaxRow ?? pictureMaxRow;
            int _rangeMinCol = rangeMinCol ?? pictureMinCol;
            int _rangeMaxCol = rangeMaxCol ?? pictureMaxCol;

            if (onlyInternal)
            {
                return (_rangeMinRow <= pictureMinRow && _rangeMaxRow >= pictureMaxRow &&
                        _rangeMinCol <= pictureMinCol && _rangeMaxCol >= pictureMaxCol);
            }
            else
            {
                return ((Math.Abs(_rangeMaxRow - _rangeMinRow) + Math.Abs(pictureMaxRow - pictureMinRow) >= Math.Abs(_rangeMaxRow + _rangeMinRow - pictureMaxRow - pictureMinRow)) &&
                (Math.Abs(_rangeMaxCol - _rangeMinCol) + Math.Abs(pictureMaxCol - pictureMinCol) >= Math.Abs(_rangeMaxCol + _rangeMinCol - pictureMaxCol - pictureMinCol)));
            }
        }


    }

    /// <summary>
    /// 工作薄區(qū)域
    /// 作者:Zuowenjun
    /// </summary>
    public class SheetRange
    {
        public int? MinRow { get; set; }
        public int? MaxRow { get; set; }
        public int? MinColumn { get; set; }
        public int? MaxColumn { get; set; }

        public SheetRange()
        { }

        public SheetRange(int minRow, int maxRow, int minColumn, int maxColumn)
        {
            this.MinRow = minRow;
            this.MaxRow = maxRow;
            this.MinColumn = minColumn;
            this.MaxColumn = maxColumn;
        }

        public override bool Equals(object obj)
        {
            bool equalResult = false;
            equalResult = base.Equals(obj);
            if (!equalResult)
            {
                var otherSheetRange = obj as SheetRange;
                if (otherSheetRange != null)
                {
                    equalResult = (this.MinRow <= otherSheetRange.MinRow && this.MaxRow >= otherSheetRange.MaxRow
                        && this.MinColumn <= otherSheetRange.MinColumn && this.MaxColumn >= otherSheetRange.MaxColumn);
                }
            }
            return equalResult;
        }

        public override int GetHashCode()
        {
            return this.ToString().GetHashCode();
        }

        public override string ToString()
        {
            return string.Format("MinRow:{0},MaxRow:{1},MinColumn:{2},MaxColumn:{3}", this.MinRow, this.MaxRow, this.MinColumn, this.MaxColumn);
        }

    }

}

分享我基于NPOI+ExcelReport實(shí)現(xiàn)的導(dǎo)入與導(dǎo)出EXCEL類(lèi)庫(kù):ExcelUtility 其它相關(guān)文章鏈接:

分享我基于NPOI+ExcelReport實(shí)現(xiàn)的導(dǎo)入與導(dǎo)出EXCEL類(lèi)庫(kù):ExcelUtility

?

分享我基于NPOI+ExcelReport實(shí)現(xiàn)的導(dǎo)入與導(dǎo)出EXCEL類(lèi)庫(kù):ExcelUtility (續(xù)篇)

?


本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線(xiàn)人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話(huà)題

夸克網(wǎng)盤(pán)怎么分享到百度網(wǎng)盤(pán)? 夸克網(wǎng)盤(pán)怎么分享到百度網(wǎng)盤(pán)? Mar 14, 2024 pm 04:40 PM

  夸克網(wǎng)盤(pán)和百度網(wǎng)盤(pán)都是很便利的存儲(chǔ)工具,不少的用戶(hù)們都在詢(xún)問(wèn)這兩款軟件互通嗎?夸克網(wǎng)盤(pán)怎么分享到百度網(wǎng)盤(pán)?下面就讓本站來(lái)為用戶(hù)們來(lái)仔細(xì)的介紹一下夸克網(wǎng)盤(pán)的文件怎么保存到百度網(wǎng)盤(pán)方法吧。  夸克網(wǎng)盤(pán)的文件怎么保存到百度網(wǎng)盤(pán)方法  1、想要知道怎么把夸克網(wǎng)盤(pán)的文件轉(zhuǎn)到百度網(wǎng)盤(pán),首先在夸克網(wǎng)盤(pán)上下載需要保存的文件,然后打開(kāi)百度網(wǎng)盤(pán)客戶(hù)端后,選擇壓縮文件要保存的文件夾,雙擊打開(kāi)該文件夾?! ?、打開(kāi)該文件夾后,點(diǎn)擊窗口左上角區(qū)域的“上傳”?! ?、在電腦中找到需要上傳的壓縮文件,點(diǎn)擊選

華為手機(jī)如何實(shí)現(xiàn)雙微信登錄? 華為手機(jī)如何實(shí)現(xiàn)雙微信登錄? Mar 24, 2024 am 11:27 AM

華為手機(jī)如何實(shí)現(xiàn)雙微信登錄?隨著社交媒體的興起,微信已經(jīng)成為人們?nèi)粘I钪胁豢苫蛉钡臏贤üぞ咧弧H欢?,許多人可能會(huì)遇到一個(gè)問(wèn)題:在同一部手機(jī)上同時(shí)登錄多個(gè)微信賬號(hào)。對(duì)于華為手機(jī)用戶(hù)來(lái)說(shuō),實(shí)現(xiàn)雙微信登錄并不困難,本文將介紹華為手機(jī)如何實(shí)現(xiàn)雙微信登錄的方法。首先,華為手機(jī)自帶的EMUI系統(tǒng)提供了一個(gè)很便利的功能——應(yīng)用雙開(kāi)。通過(guò)應(yīng)用雙開(kāi)功能,用戶(hù)可以在手機(jī)上同

網(wǎng)易云音樂(lè)本地歌曲怎么導(dǎo)入 本地歌曲導(dǎo)入方法 網(wǎng)易云音樂(lè)本地歌曲怎么導(dǎo)入 本地歌曲導(dǎo)入方法 Mar 13, 2024 am 11:19 AM

  我們?cè)谑褂眠@款平臺(tái)來(lái)聽(tīng)歌的時(shí)候,應(yīng)該大部分都是有著你們所想聽(tīng)的一些歌曲的,當(dāng)然有些事可能因?yàn)闆](méi)有版權(quán)而聽(tīng)不了,當(dāng)然我們也可以直接的使用導(dǎo)入本地的一些歌曲到上面,這樣就可以聽(tīng)了。我們可以下載一些歌曲直接的轉(zhuǎn)化為mp3類(lèi)型的一些格式,這樣在手機(jī)上面就可以?huà)呙鑱?lái)進(jìn)行一些導(dǎo)入等情況了。不過(guò)對(duì)于大多數(shù)的用戶(hù)們來(lái)說(shuō),導(dǎo)入本地的一些歌曲內(nèi)容等方面都是并不怎么了解的,所以為了能夠很好的解決這些問(wèn)題,今日小編也會(huì)給大家們來(lái)好好的講解一下其中的內(nèi)容方法,讓大家們可以更好的對(duì)其進(jìn)行一些選擇都是沒(méi)問(wèn)的,有興趣的話(huà),

網(wǎng)易云音樂(lè)怎么分享到微信朋友圈_網(wǎng)易云音樂(lè)分享到微信朋友圈教程 網(wǎng)易云音樂(lè)怎么分享到微信朋友圈_網(wǎng)易云音樂(lè)分享到微信朋友圈教程 Mar 25, 2024 am 11:41 AM

1、首先我們進(jìn)入到網(wǎng)易云音樂(lè)中,然后在軟件首頁(yè)界面中,點(diǎn)擊進(jìn)入到歌曲的播放界面中。2、然后在歌曲播放界面中,找到右上方的分享功能按鈕,如下圖紅框所示位置,點(diǎn)擊選擇分享的渠道;在分享渠道中,點(diǎn)擊底部的“分享至”選項(xiàng),然后選擇第一個(gè)“微信朋友圈”,即可將內(nèi)容分享至微信朋友圈。

PHP編程指南:實(shí)現(xiàn)斐波那契數(shù)列的方法 PHP編程指南:實(shí)現(xiàn)斐波那契數(shù)列的方法 Mar 20, 2024 pm 04:54 PM

編程語(yǔ)言PHP是一種用于Web開(kāi)發(fā)的強(qiáng)大工具,能夠支持多種不同的編程邏輯和算法。其中,實(shí)現(xiàn)斐波那契數(shù)列是一個(gè)常見(jiàn)且經(jīng)典的編程問(wèn)題。在這篇文章中,將介紹如何使用PHP編程語(yǔ)言來(lái)實(shí)現(xiàn)斐波那契數(shù)列的方法,并附上具體的代碼示例。斐波那契數(shù)列是一個(gè)數(shù)學(xué)上的序列,其定義如下:數(shù)列的第一個(gè)和第二個(gè)元素為1,從第三個(gè)元素開(kāi)始,每個(gè)元素的值等于前兩個(gè)元素的和。數(shù)列的前幾個(gè)元

Oracle導(dǎo)入中文數(shù)據(jù)時(shí)出現(xiàn)亂碼怎么解決? Oracle導(dǎo)入中文數(shù)據(jù)時(shí)出現(xiàn)亂碼怎么解決? Mar 10, 2024 am 09:54 AM

標(biāo)題:解決Oracle導(dǎo)入中文數(shù)據(jù)亂碼問(wèn)題的方法及代碼示例在Oracle數(shù)據(jù)庫(kù)中導(dǎo)入中文數(shù)據(jù)時(shí),經(jīng)常會(huì)出現(xiàn)亂碼的情況,這可能是由于數(shù)據(jù)庫(kù)字符集設(shè)置不正確或者導(dǎo)入過(guò)程中出現(xiàn)編碼轉(zhuǎn)換問(wèn)題所致。為了解決這個(gè)問(wèn)題,我們可以采取一些方法來(lái)保證導(dǎo)入的中文數(shù)據(jù)能夠正確顯示。下面是一些解決方案及具體的代碼示例:一、檢查數(shù)據(jù)庫(kù)字符集設(shè)置在Oracle數(shù)據(jù)庫(kù)中,字符集的設(shè)置對(duì)于

百度網(wǎng)盤(pán)怎么分享文件給好友 百度網(wǎng)盤(pán)怎么分享文件給好友 Mar 25, 2024 pm 06:52 PM

近期,百度網(wǎng)盤(pán)安卓客戶(hù)端迎來(lái)了全新的8.0.0版本,這一版本不僅帶來(lái)了眾多變化,還增添了諸多實(shí)用功能。其中,最為引人注目的便是文件夾共享功能的增強(qiáng)?,F(xiàn)在,用戶(hù)可以輕松邀請(qǐng)好友加入,共同分享工作和生活中的重要文件,實(shí)現(xiàn)更加便捷的協(xié)作與共享。那么究竟該如何分享給好友自己需要分享的文件呢,下文中本站小編就將為大家?guī)?lái)詳細(xì)內(nèi)容介紹,希望能幫助到大家!1)打開(kāi)百度云APP,首先點(diǎn)擊在首頁(yè)中選擇相關(guān)的文件夾,然后再點(diǎn)擊界面右上角的【...】圖標(biāo);(如下圖)2)隨后點(diǎn)擊“共享成員”一欄中的【+】,最后在勾選所

PHP游戲需求實(shí)現(xiàn)指南 PHP游戲需求實(shí)現(xiàn)指南 Mar 11, 2024 am 08:45 AM

PHP游戲需求實(shí)現(xiàn)指南隨著互聯(lián)網(wǎng)的普及和發(fā)展,網(wǎng)頁(yè)游戲的市場(chǎng)也越來(lái)越火爆。許多開(kāi)發(fā)者希望利用PHP語(yǔ)言來(lái)開(kāi)發(fā)自己的網(wǎng)頁(yè)游戲,而實(shí)現(xiàn)游戲需求是其中一個(gè)關(guān)鍵步驟。本文將介紹如何利用PHP語(yǔ)言來(lái)實(shí)現(xiàn)常見(jiàn)的游戲需求,并提供具體的代碼示例。1.創(chuàng)建游戲角色在網(wǎng)頁(yè)游戲中,游戲角色是非常重要的元素。我們需要定義游戲角色的屬性,比如姓名、等級(jí)、經(jīng)驗(yàn)值等,并提供方法來(lái)操作這些

See all articles