NPOI

来源:http://www.cnblogs.com/houlin/archive/2016/02/19/5202160.html
-Advertisement-
Play Games

前言: NPOI 技術在別人看來可能有點老生長談了,但是對於我現在處於的這個創業型公司,還是挺前沿的,不知道是前輩們不知道這個技術,還是懶得去對現有的軟體進行修改,因為在現有的軟體中,幾乎所有的數據導入導出都是依賴於: Excel.Application(設置excel組件,系統許可權,然後還得考慮版


前言:

         NPOI 技術在別人看來可能有點老生長談了,但是對於我現在處於的這個創業型公司,還是挺前沿的,不知道是前輩們不知道這個技術,還是懶得去對現有的軟體進行修改,因為在現有的軟體中,幾乎所有的數據導入導出都是依賴於:

        Excel.Application(設置excel組件,系統許可權,然後還得考慮版本一系列的問題)都是

        基於現有的方法,之前的技術團隊在軟體沒有推廣之前可能自我感覺良好,沒有進行一些系統性的測試,在加上一些別的因素吧,導致在工程文件中對 Excel.Application 的操作方法,操作類層出不窮,算了,不揭短了。

        有的時候向領導提出想對項目框架優化,或者對代碼的優化有所動作的時候,總會有層出不窮的原因導致這個動作漸漸的滯後。這隻是一個點,可想而知在沒有一個真正的技術經理參與的項目中,沒有對框架優化,方法重構的發起人,本來不是很複雜的項目,代碼的臃腫,堪憂。

 

算了,不吐槽了,可能是好久沒有寫博的原因。哭泣的臉

數據輸出方法:

    /// <summary>
    /// 攜帶數據導出
     /// </summary>
    /// <param name="dtSource"></param>
    /// <param name="_excelName"></param>
    /// <param name="str_fieldtext"></param>
    public void export(DataTable dtSource, string _excelName, string str_fieldtext)
    {
        HttpContext curContext = HttpContext.Current;
        // 設置編碼和附件格式
        curContext.Response.ContentType = "application/ms-excel";
        curContext.Response.ContentEncoding = Encoding.UTF8;
        curContext.Response.Charset = "";
        string fileName = _excelName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; //Excel文件名稱
        curContext.Response.AppendHeader("Content-Disposition",
            "attachment;filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
        //調用導出具體方法Export()
        curContext.Response.BinaryWrite(Export(dtSource, _excelName, str_fieldtext).GetBuffer());
        curContext.Response.End();
    }

導出方法:

#region DataTable導出到Excel
    /// <summary>
    /// DataTable導出到Excel的MemoryStream Export()
    /// </summary>
    /// <param name="dtSource">DataTable數據源</param>
    /// <param name="strHeaderText">Excel表頭文本</param>
    /// <param name="str_fieldtext"></param> 
    public static MemoryStream Export(DataTable dtSource, string strHeaderText, string str_fieldtext)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();

        ISheet sheet = workbook.CreateSheet("Data");

        ISheet sheet2 = workbook.CreateSheet("ShtDictionary");

        //sheet.DisplayGridlines = false;//隱藏網格線

        #region 右擊文件 屬性信息
        {
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "NPOI";
            workbook.DocumentSummaryInformation = dsi;

            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Author = "文件作者信息"; //填加xls文件作者信息
            si.ApplicationName = "創建程式信息"; //填加xls文件創建程式信息
            si.LastAuthor = "最後保存者信息"; //填加xls文件最後保存者信息
            si.Comments = "作者信息"; //填加xls文件作者信息
            si.Title = "標題信息"; //填加xls文件標題信息
            si.Subject = "主題信息";//填加文件主題信息
            si.CreateDateTime = System.DateTime.Now;
            workbook.SummaryInformation = si;
        }
        #endregion

        ICellStyle dateStyle = workbook.CreateCellStyle();

        IDataFormat format = workbook.CreateDataFormat();

        dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");

        //取得列寬
        int[] arrColWidth = new int[dtSource.Columns.Count];

        foreach (DataColumn item in dtSource.Columns)
        {
            arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
        }

        for (int i = 0; i < dtSource.Rows.Count; i++)
        {
            for (int j = 0; j < dtSource.Columns.Count; j++)
            {
                int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;

                if (intTemp > arrColWidth[j])
                {
                    arrColWidth[j] = intTemp;
                }
            }
        }
        int rowIndex = 0;

        foreach (DataRow row in dtSource.Rows)
        {
            #region 新建表,填充表頭,填充列頭,樣式
            if (rowIndex == 65535 || rowIndex == 0)
            {
                if (rowIndex != 0)
                {
                    sheet = workbook.CreateSheet();
                }

                #region 表頭及樣式
                {
                    //IRow headerRow = sheet.CreateRow(0);

                    //headerRow.HeightInPoints = 25;

                    //headerRow.CreateCell(0).SetCellValue(strHeaderText);

                    //ICellStyle headStyle = workbook.CreateCellStyle();

                    //headStyle.Alignment = HorizontalAlignment.Center;

                    //IFont font = workbook.CreateFont();

                    //font.FontHeightInPoints = 20;

                    //font.Boldweight = 700;

                    //headStyle.SetFont(font);

                    //headerRow.GetCell(0).CellStyle = headStyle;

                    //sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
                }
                #endregion

                #region 列頭及樣式
                {
                    IRow headerRow = sheet.CreateRow(0);

                    ICellStyle headStyle = workbook.CreateCellStyle();

                    headStyle.Alignment = HorizontalAlignment.Center;

                    IFont font = workbook.CreateFont();

                    font.FontHeightInPoints = 10;

                    font.Boldweight = 700;

                    headStyle.SetFont(font);

                    headStyle.FillPattern = FillPattern.SolidForeground;

                    headStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index2;//單元格背景色

                    HSSFPatriarch patr = sheet.CreateDrawingPatriarch() as HSSFPatriarch;

                    HSSFClientAnchor a = new HSSFClientAnchor();

                    a.Dx1 = 0;

                    a.Dy1 = 0;

                    a.Dx2 = 0;

                    a.Dy2 = 0;

                    int colindex = 27;
                    string[] str_text = { };
                    if (str_fieldtext.Length > 0)
                    {
                        str_text = str_fieldtext.Split(',');
                    }
                    foreach (DataColumn column in dtSource.Columns)
                    {
                        a.Col1 = column.Ordinal + 1;//批註起始位置的縱坐標(當前單元格位置+2)  

                        a.Col2 = column.Ordinal + 3;//批註結束位置的縱坐標  

                        a.Row1 = column.Ordinal + 0;//批註起始位置的橫坐標  

                        a.Row2 = column.Ordinal + 4;//批註結束位置的橫坐標  

                        HSSFComment co = patr.CreateComment(a);//實例化批註模型

                        co.String = new HSSFRichTextString(Convert.ToString(column.ColumnName));//批註內容

                        co.Author = "大通軟體";//批註者
                        if (str_text.Length > 0)
                            headerRow.CreateCell(column.Ordinal).SetCellValue(str_text[column.Ordinal]);//添加單元格內容
                        else
                            headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);//添加單元格內容
                        headerRow.GetCell(column.Ordinal).CellComment = co;//在該單元格是那個添加批註

                        headerRow.GetCell(column.Ordinal).CellStyle = headStyle;//給該單元格添加樣式

                        sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);//設置列寬

                        #region 凍結
                        ///下麵對CreateFreezePane的參數作一下說明:
                        ///第一個參數表示要凍結的列數;
                        ///第二個參數表示要凍結的行數,這裡只凍結列所以為0;
                        ///第三個參數表示右邊區域可見的首列序號,從1開始計算;
                        ///第四個參數表示下邊區域可見的首行序號,也是從1開始計算,這裡是凍結列,所以為0;
                        //sheet.CreateFreezePane(1, 0, 1, 0);//凍結首列

                        sheet.CreateFreezePane(0, 1, 0, 1);//凍結首行
                        #endregion

                        #region 下拉

                        //if (column.Ordinal == 0)
                        //{
                        //    sheet2.CreateRow(0).CreateCell(0).SetCellValue("itemA");

                        //    sheet2.CreateRow(1).CreateCell(0).SetCellValue("itemB");

                        //    sheet2.CreateRow(2).CreateCell(0).SetCellValue("itemC");
                        //}
                        //else
                        //{
                        //    sheet2.GetRow(0).CreateCell(column.Ordinal).SetCellValue("itemA" + column.Ordinal + "");

                        //    sheet2.GetRow(1).CreateCell(column.Ordinal).SetCellValue("itemB" + column.Ordinal + "");

                        //    sheet2.GetRow(2).CreateCell(column.Ordinal).SetCellValue("itemC" + column.Ordinal + "");
                        //}

                        //string colname = string.Empty;

                        //int remainder = 0;

                        //remainder = colindex % 26;

                        //if (remainder == 0) remainder = 26;

                        //colname = Convert.ToString((char)(remainder + 64));

                        //IName range = workbook.CreateName();

                        //range.RefersToFormula = string.Format("{0}!$" + colname + "$1:$" + colname + "${1}", "ShtDictionary", 3);

                        //range.NameName = "dicRange" + column.Ordinal + "";

                        //ISheet sheet1 = workbook.GetSheet("Data");
                        ////碰對了,第四個參數確定每次的下拉放到哪個column.Ordinal列,因缺思停
                        //CellRangeAddressList regions = new CellRangeAddressList(0, 65535, 0, column.Ordinal);

                        //DVConstraint constraint = DVConstraint.CreateFormulaListConstraint("dicRange" + column.Ordinal + "");

                        //HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);

                        //sheet1.AddValidationData(dataValidate);

                        //colindex++;

                        #endregion
                    }
                }
                #endregion

                rowIndex = 1;
            }
            #endregion

            #region 填充內容

            IRow dataRow = sheet.CreateRow(rowIndex);

            foreach (DataColumn column in dtSource.Columns)
            {
                ICell newCell = dataRow.CreateCell(column.Ordinal);

                string drValue = row[column].ToString();

                switch (column.DataType.ToString())
                {
                    case "System.String"://字元串類型
                        newCell.SetCellValue(drValue);

                        break;
                    case "System.DateTime"://日期類型
                        System.DateTime dateV;
                        System.DateTime.TryParse(drValue, out dateV);
                        newCell.SetCellValue(dateV);
                        newCell.CellStyle = dateStyle;//格式化顯示
                        break;
                    case "System.Boolean"://布爾型
                        bool boolV = false;
                        bool.TryParse(drValue, out boolV);
                        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.SetCellValue(intV);
                        break;
                    case "System.Decimal"://浮點型
                    case "System.Double":
                        double doubV = 0;
                        double.TryParse(drValue, out doubV);
                        newCell.SetCellValue(doubV);
                        break;
                    case "System.DBNull"://空值處理
                        newCell.SetCellValue("");
                        break;
                    default:
                        newCell.SetCellValue("");
                        break;
                }
            }

            #endregion

            rowIndex++;
        }
        using (MemoryStream ms = new MemoryStream())
        {
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
            return ms;
        }
    }
    #endregion

讀取excel 數據:

    /// <summary>
    /// 讀取excel ,預設第一行為標頭(獲取DataTable)
    /// </summary>
    /// <param name="strFileName">excel文檔路徑</param>
    /// <returns></returns>
    public DataTable Import(string strFileName)
    {
        DataTable dt = new DataTable();

        HSSFWorkbook hssfworkbook;

        using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
        {
            hssfworkbook = new HSSFWorkbook(file);
        }
        ISheet sheet = hssfworkbook.GetSheetAt(0);
        System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

        IRow headerRow = sheet.GetRow(0);
        int cellCount = headerRow.LastCellNum;

        for (int j = 0; j < cellCount; j++)
        {
            ICell cell = headerRow.GetCell(j);
            dt.Columns.Add(cell.ToString());
        }

        for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            DataRow dataRow = dt.NewRow();

            for (int j = row.FirstCellNum; j < cellCount; j++)
            {
                if (row.GetCell(j) != null)
                {
                    if (row.GetCell(j).ToString().Contains('/'))
                    {
                        string[] a = row.GetCell(j).ToString().Split('/');

                        dataRow[j] = "20" + a[2] + "-" + a[0] + "-" + a[1];
                    }
                    else
                    {
                        dataRow[j] = row.GetCell(j).ToString();
                    }
                }
                else
                {
                    dataRow[j] = null;
                }
            }

            dt.Rows.Add(dataRow);
        }
        return dt;
    }

換一種方式:

    /// <summary>
    /// 導出excel 模板
     /// </summary>
    /// <param name="str_fieldid"></param>
    /// <param name="str_fieldtext"></param>
    /// <returns></returns>
    public void export(string _excelName, string str_fieldid, string str_fieldtext)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();

        ISheet sheet = workbook.CreateSheet("Data");

        #region 右擊文件 屬性信息
        {
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "NPOI";
            workbook.DocumentSummaryInformation = dsi;

            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Author = "文件作者信息"; //填加xls文件作者信息
              si.ApplicationName = "創建程式信息"; //填加xls文件創建程式信息
              si.LastAuthor = "最後保存者信息"; //填加xls文件最後保存者信息
              si.Comments = "作者信息"; //填加xls文件作者信息
              si.Title = "標題信息"; //填加xls文件標題信息
              si.Subject = "主題信息";//填加文件主題信息
              si.CreateDateTime = System.DateTime.Now;
            workbook.SummaryInformation = si;
        }
        #endregion

        ICellStyle dateStyle = workbook.CreateCellStyle();

        IDataFormat format = workbook.CreateDataFormat();

        dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");

        int rowIndex = 0;

        #region 新建表,填充表頭,填充列頭,樣式
        if (rowIndex == 65535 || rowIndex == 0)
        {
            if (rowIndex != 0)
            {
                sheet = workbook.CreateSheet();
            }

            #region 列頭及樣式
            {
                IRow headerRow = sheet.CreateRow(0);

                ICellStyle headStyle = workbook.CreateCellStyle();

                headStyle.Alignment = HorizontalAlignment.Center;

                IFont font = workbook.CreateFont();

                font.FontHeightInPoints = 10;

                font.Boldweight = 700;

                headStyle.SetFont(font);

                headStyle.FillPattern = FillPattern.SolidForeground;

                headStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index2;//單元格背景色

                HSSFPatriarch patr = sheet.CreateDrawingPatriarch() as HSSFPatriarch;

                HSSFClientAnchor a = new HSSFClientAnchor();

                a.Dx1 = 0;

                a.Dy1 = 0;

                a.Dx2 = 0;

                a.Dy2 = 0;

                string[] str_text = { };

                string[] str_field = { };

                if (str_fieldtext.Length > 0)
                {
                    str_text = str_fieldtext.Split(',');
                }

                if (str_fieldid.Length > 0)
                {
                    str_field = str_fieldid.Split(',');
                }

                //取得列寬
                int[] arrColWidth = new int[str_text.Length];

                for (int i = 0; i < str_text.Length; i++)
                {
                    a.Col1 = i + 1;//批註起始位置的縱坐標(當前單元格位置+2)  

                    a.Col2 = i + 3;//批註結束位置的縱坐標  

                    a.Row1 = i + 0;//批註起始位置的橫坐標  

                    a.Row2 = i + 4;//批註結束位置的橫坐標  

                    HSSFComment co = patr.CreateComment(a);//實例化批註模型

                    co.String = new HSSFRichTextString(Convert.ToString(str_field[i]));//批註內容

                    co.Author = "大通軟體";//批註者
                    if (str_text.Length > 0)
                        headerRow.CreateCell(i).SetCellValue(str_text[i]);//添加單元格內容
                    else
                        headerRow.CreateCell(i).SetCellValue(str_field[i]);//添加單元格內容
                    headerRow.GetCell(i).CellComment = co;//在該單元格是那個添加批註

                    headerRow.GetCell(i).CellStyle = headStyle;//給該單元格添加樣式

                    sheet.SetColumnWidth(i, 20 * 256);//設置列寬

                    //sheet.SetColumnWidth(i, 250);

                    #region 凍結

                    sheet.CreateFreezePane(0, 1, 0, 1);//凍結首行

                    #endregion
                }
            }
            #endregion

            rowIndex = 1;
        }
        #endregion

        using (MemoryStream ms = new MemoryStream())
        {
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
            ExportOut(ms, _excelName);
        }
    }

    /// <summary>
    /// 輸出方法
    /// </summary>
    /// <param name="ms"></param>
    /// <param name="_excelName"></param>
    public void ExportOut(MemoryStream ms, string _excelName)
    {
        HttpContext curContext = HttpContext.Current;
        // 設置編碼和附件格式
         curContext.Response.ContentType = "application/ms-excel";
        curContext.Response.ContentEncoding = Encoding.UTF8;
        curContext.Response.Charset = "";
        string fileName = _excelName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; //Excel文件名稱
          curContext.Response.AppendHeader("Content-Disposition",
            "attachment;filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
        //調用導出具體方法Export()
        curContext.Response.BinaryWrite(ms.GetBuffer());
        curContext.Response.End();
    }

NPOI組件:    http://files.cnblogs.com/files/houlin/NPOI.zip

 

後言:

以上就是一些方法來自園子里好多前輩的博文,我自己沒有做什麼優化,目前只做記錄,備忘,不喜勿噴。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言:之前偶然的機會學習了廖老師關於Git學習的一個網站,講解的很好很詳細,通俗易懂,學習之餘決定將廖老師帖子的精髓作一個總結(相當於是筆記啦~~),也方便日後查詢鞏固,希望大家共勉!查看廖老師詳細原帖! 1、安裝Git 這裡,我只介紹一下在Linux系統下Git的安裝,如果需要瞭解Unix、Mac
  • 一、生成證書,所需機器數必須 >= 2(一臺生成服務端證書,一臺生成客戶端證書),以下伺服器以A表示服務端、B表示客戶端來舉例,thrift版本為0.7.01、自簽名的證書的生成和測試 1)生成密鑰和證書相關 服務端A, openssl genrsa -out server-key.pem 2048
  • atitit.ntfs ext 文件系統新特性對比 1. 現代文件系統應該有的特性2 1.1. 恢復Log2 1.2. 壓縮2 1.3. Meta ext2 1.4. Fulltextཟsearch 全文2 1.5. Copy 校驗2 1.6. 稀疏文件,這是UNIX類和NTFS等文件系統的一個特性
  • 今天老師說了一個例子,提生面向對象思想,和大家分享下 雙擊可對其評價和評分 相對以前 我們有可能會這樣寫 //定義一個Tool類進行傳值 Tool.name = lv.SelectedItems[0].SubItems[1].Text;//姓名 Tool.pingjia = lv.SelectedI
  • 在程式中建立如下方法。 #region 刷新數據源 /// ///刷新數據源 /// /// dgv that is needed to refresh public void RefreshDataSourceOndgv(DataGridView dgv) ...
  • 在代碼生成工具的各種功能規劃中,我們一向以客戶的需求作為驅動,因此也會根據需要增加一些特殊的功能或者處理。在實際的開發中,雖然我們一般以具體的表進行具體業務開發,但是有些客戶提出有時候視圖開發也是很常見的,為了提高代碼生成和界面生成的效率,基於視圖開發的過程也應該支持。還有主從表的界面生成操作,在很...
  • 最近在做個包含了大量重覆樣式的控制項的網站. 如果用MVC的話,我可以針對每個需要單獨塊編輯的Model寫一個局部視圖. 然後根據不同邏輯需求拼起來.用現成MVC框架非常容易做到. 但環境是3.5的最高只能用MVC2,沒有razor語法,加上沒裝開發環境. 於是想乾脆自己寫一個模板生成HTML的框架,
  • 這個是2011年寫的一個技術貼,現在看可能有點過時了,有興趣的朋友也可以看一下。 一. 描述 在開發winform程式時不會考慮頁面刷新問題,只要控制好線程別導致假死就ok了,但是在開發web頁面程式時,刷新有的時候真是頭痛的很。頁面回調可以解決這個問題,下麵簡單就實用來講對callback做下介紹
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...