Oracle導出excel

来源:http://www.cnblogs.com/mellowsmile/archive/2016/03/15/5277880.html
-Advertisement-
Play Games

oracle導出excel(非csv)的方法有兩種,1、使用sqlplus  spool,2、使用包體 現將網上相關代碼整理後貼出以備不時之需: 使用sqlplus: 使用sqlplus需要兩個文件:sql腳本文件和格式設置文件。 sql腳本,get_tables.sql 然後在sqlplus下運行


oracle導出excel(非csv)的方法有兩種,1、使用sqlplus  spool,2、使用包體 現將網上相關代碼整理後貼出以備不時之需:

使用sqlplus:

使用sqlplus需要兩個文件:sql腳本文件和格式設置文件。

去除冗餘信息,main.sql
--main.sql   註意,需要在sqlplus下運行  非plsql命令行下
set linesize 200
set term off verify off feedback off pagesize 999 
set markup html on entmap ON spool on preformat off
spool test_tables.xls
@get_tables.sql
spool off
exit

sql腳本,get_tables.sql

--get_tables.sql
select * from all_objects where rownum<=1000;

然後在sqlplus下運行main.sql

使用包體編程:

 

create or replace package smt_xlsx_maker_pkg is

  /******************************************************************************
     NAME:       SMT_XLSX_MAKER_PKG
     PURPOSE:    XLSX 生成 Pkg,主要是從Oracle資料庫端生成Xlsx二進位的文件。
  
     REVISIONS:
     Ver        Date        Author           Description
     ---------  ----------  ---------------  ------------------------------------
     1.0        2011/2/19   Anton Scheffer   1,New Create the pkg
     1.1        2015/6/10     Sam.T          1.優化核心處理生成xlsx的代碼,使得生成文檔的執行效率大大提高!
     1.1        2015/6/10     Sam.T          1.query2sheet增加綁定變數的可選輸入參數。
     1.2        2015/6/15     Sam.T          1.代碼增加調試模式。直接設置G_DEBUG_MODE變數即可。
     1.2        2015/6/20     Sam.T          1.為方便使用,再次封裝一些簡單易用的過程,生成xlsx文檔
     1.2        2015/7/5     Sam.T          1.單條SQL生成xlsx文檔的內容,增加是否顯示foot,以及顯示的行數。
                             jinzhao         解決數據量較大情況下導出excel報錯xml的問題。將dbms_lob.writeappend修改為dbms_lob.append
  ******************************************************************************/
  ---------
  /**********************************************
  ******************************************************************************
  Copyright (C) 2011, 2012 by Anton Scheffer
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:
  
  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  THE SOFTWARE.
  
  ******************************************************************************
  ******************************************** */
  /*
  使用方法:
  declare
    l_sql varchar2(30000);
  begin
    l_sql := 'select * from all_objects';
    smt_xlsx_maker_pkg.query2sheet(l_sql,
                                   true,
                                   'XLS_DIR',
                                   'Export2.xlsx');
  end;
  除此之外,基本上Excel 中有的效果它都可以生成。
  以下一個例子,包括居中,合併單元格,底色,新增工作表等:
  begin
    smt_xlsx_maker_pkg.clear_workbook;
    smt_xlsx_maker_pkg.new_sheet;
    smt_xlsx_maker_pkg.cell(5, 1, 5);
    smt_xlsx_maker_pkg.cell(3, 1, 3);
    smt_xlsx_maker_pkg.cell(2, 2, 45);
    smt_xlsx_maker_pkg.cell(3,
                            2,
                            'Anton Scheffer',
                            p_alignment => smt_xlsx_maker_pkg.get_alignment(p_wraptext => true));
    smt_xlsx_maker_pkg.cell(1,
                            4,
                            sysdate,
                            p_fontid => smt_xlsx_maker_pkg.get_font('Calibri',
                                                                    p_rgb => 'FFFF0000'));
    smt_xlsx_maker_pkg.cell(2,
                            4,
                            sysdate,
                            p_numfmtid => smt_xlsx_maker_pkg.get_numfmt('dd/mm/yyyy h:mm'));
    smt_xlsx_maker_pkg.cell(3,
                            4,
                            sysdate,
                            p_numfmtid => smt_xlsx_maker_pkg.get_numfmt(smt_xlsx_maker_pkg.orafmt2excel('dd/mon/yyyy')));
    smt_xlsx_maker_pkg.cell(5,
                            5,
                            75,
                            p_borderid => smt_xlsx_maker_pkg.get_border('double',
                                                                        'double',
                                                                        'double',
                                                                        'double'));
    smt_xlsx_maker_pkg.cell(2, 3, 33);
    smt_xlsx_maker_pkg.hyperlink(1,
                                 6,
                                 'http://www.cnblogs.com/mellowsmile',
                                 'jinzhao site');
    smt_xlsx_maker_pkg.cell(1,
                            7,
                            'Some merged cells',
                            p_alignment => smt_xlsx_maker_pkg.get_alignment(p_horizontal => 'center'));
    smt_xlsx_maker_pkg.mergecells(1, 7, 3, 7);
    for i in 1 .. 5 loop
      smt_xlsx_maker_pkg.comment(3, i + 3, 'Row ' || (i + 3), 'Anton');
    end loop;
    smt_xlsx_maker_pkg.new_sheet;
    smt_xlsx_maker_pkg.set_row(1,
                               p_fillid => smt_xlsx_maker_pkg.get_fill('solid',
                                                                       'FFFF0000'));
    for i in 1 .. 5 loop
      smt_xlsx_maker_pkg.cell(1, i, i);
      smt_xlsx_maker_pkg.cell(2, i, i * 3);
      smt_xlsx_maker_pkg.cell(3, i, 'x ' || i * 3);
    end loop;
    smt_xlsx_maker_pkg.query2sheet('select rownum, x.*
  , case when mod( rownum, 2 ) = 0 then rownum * 3 end demo
  , case when mod( rownum, 2 ) = 1 then ''demo '' || rownum end demo2 from dual x connect by rownum <= 5');
    smt_xlsx_maker_pkg.save('XLS_DIR', 'Export3.xlsx');
  end;
  
  */
  g_debug_mode boolean := false;

  ---DBMS_OUTPUT直接輸出/FILE_OUTPUT文檔輸出/REQUEST_OUTPUT請求日誌輸出/CONTEXT_OUTPUT 將日誌改為上下文輸出
  g_debug_type varchar2(240) := 'DBMS_OUTPUT';

  ---綁定變數用的臨時表變數
  type rec_col_value is record(
    col_id    number(3),
    col_value varchar2(2400));

  type tab_col_value is table of rec_col_value index by binary_integer;

  --
  type tp_alignment is record(
    vertical   varchar2(11),
    horizontal varchar2(16),
    wraptext   boolean);

  --
  procedure clear_workbook;

  --
  procedure new_sheet(p_sheetname varchar2 := null);

  --
  function orafmt2excel(p_format varchar2 := null) return varchar2;

  --
  function get_numfmt(p_format varchar2 := null) return pls_integer;

  --
  function get_font(p_name      varchar2,
                    p_family    pls_integer := 2,
                    p_fontsize  number := 11,
                    p_theme     pls_integer := 1,
                    p_underline boolean := false,
                    p_italic    boolean := false,
                    p_bold      boolean := false,
                    p_rgb       varchar2 := null -- this is a hex ALPHA Red Green Blue value
                    ) return pls_integer;

  --
  function get_fill(p_patterntype varchar2,
                    p_fgrgb       varchar2 := null -- this is a hex ALPHA Red Green Blue value
                    ) return pls_integer;

  --
  function get_border(p_top    varchar2 := 'thin',
                      p_bottom varchar2 := 'thin',
                      p_left   varchar2 := 'thin',
                      p_right  varchar2 := 'thin')
  /*
    none
    thin
    medium
    dashed
    dotted
    thick
    double
    hair
    mediumDashed
    dashDot
    mediumDashDot
    dashDotDot
    mediumDashDotDot
    slantDashDot
    */
   return pls_integer;

  --
  function get_alignment(p_vertical   varchar2 := null,
                         p_horizontal varchar2 := null,
                         p_wraptext   boolean := null)
  /* horizontal
    center
    centerContinuous
    distributed
    fill
    general
    justify
    left
    right
    */
    /* vertical
    bottom
    center
    distributed
    justify
    top
    */
   return tp_alignment;

  --
  procedure cell(p_col       pls_integer,
                 p_row       pls_integer,
                 p_value     number,
                 p_numfmtid  pls_integer := null,
                 p_fontid    pls_integer := null,
                 p_fillid    pls_integer := null,
                 p_borderid  pls_integer := null,
                 p_alignment tp_alignment := null,
                 p_sheet     pls_integer := null);

  --
  procedure cell(p_col       pls_integer,
                 p_row       pls_integer,
                 p_value     varchar2,
                 p_numfmtid  pls_integer := null,
                 p_fontid    pls_integer := null,
                 p_fillid    pls_integer := null,
                 p_borderid  pls_integer := null,
                 p_alignment tp_alignment := null,
                 p_sheet     pls_integer := null);

  --
  procedure cell(p_col       pls_integer,
                 p_row       pls_integer,
                 p_value     date,
                 p_numfmtid  pls_integer := null,
                 p_fontid    pls_integer := null,
                 p_fillid    pls_integer := null,
                 p_borderid  pls_integer := null,
                 p_alignment tp_alignment := null,
                 p_sheet     pls_integer := null);

  --
  procedure hyperlink(p_col   pls_integer,
                      p_row   pls_integer,
                      p_url   varchar2,
                      p_value varchar2 := null,
                      p_sheet pls_integer := null);

  --
  procedure comment(p_col    pls_integer,
                    p_row    pls_integer,
                    p_text   varchar2,
                    p_author varchar2 := null,
                    p_width  pls_integer := 150 -- pixels
                   ,
                    p_height pls_integer := 100 -- pixels
                   ,
                    p_sheet  pls_integer := null);

  --
  procedure mergecells(p_tl_col pls_integer -- top left
                      ,
                       p_tl_row pls_integer,
                       p_br_col pls_integer -- bottom right
                      ,
                       p_br_row pls_integer,
                       p_sheet  pls_integer := null);

  --
  procedure list_validation(p_sqref_col   pls_integer,
                            p_sqref_row   pls_integer,
                            p_tl_col      pls_integer -- top left
                           ,
                            p_tl_row      pls_integer,
                            p_br_col      pls_integer -- bottom right
                           ,
                            p_br_row      pls_integer,
                            p_style       varchar2 := 'stop' -- stop, warning, information
                           ,
                            p_title       varchar2 := null,
                            p_prompt      varchar := null,
                            p_show_error  boolean := false,
                            p_error_title varchar2 := null,
                            p_error_txt   varchar2 := null,
                            p_sheet       pls_integer := null);

  --
  procedure list_validation(p_sqref_col    pls_integer,
                            p_sqref_row    pls_integer,
                            p_defined_name varchar2,
                            p_style        varchar2 := 'stop' -- stop, warning, information
                           ,
                            p_title        varchar2 := null,
                            p_prompt       varchar := null,
                            p_show_error   boolean := false,
                            p_error_title  varchar2 := null,
                            p_error_txt    varchar2 := null,
                            p_sheet        pls_integer := null);

  --
  procedure defined_name(p_tl_col     pls_integer -- top left
                        ,
                         p_tl_row     pls_integer,
                         p_br_col     pls_integer -- bottom right
                        ,
                         p_br_row     pls_integer,
                         p_name       varchar2,
                         p_sheet      pls_integer := null,
                         p_localsheet pls_integer := null);

  --
  procedure set_column_width(p_col   pls_integer,
                             p_width number,
                             p_sheet pls_integer := null);

  --
  procedure set_column(p_col       pls_integer,
                       p_numfmtid  pls_integer := null,
                       p_fontid    pls_integer := null,
                       p_fillid    pls_integer := null,
                       p_borderid  pls_integer := null,
                       p_alignment tp_alignment := null,
                       p_sheet     pls_integer := null);

  --
  procedure set_row(p_row       pls_integer,
                    p_numfmtid  pls_integer := null,
                    p_fontid    pls_integer := null,
                    p_fillid    pls_integer := null,
                    p_borderid  pls_integer := null,
                    p_alignment tp_alignment := null,
                    p_sheet     pls_integer := null);

  --
  procedure freeze_rows(p_nr_rows pls_integer := 1,
                        p_sheet   pls_integer := null);

  --
  procedure freeze_cols(p_nr_cols pls_integer := 1,
                        p_sheet   pls_integer := null);

  --
  procedure freeze_pane(p_col   pls_integer,
                        p_row   pls_integer,
                        p_sheet pls_integer := null);

  --
  procedure set_autofilter(p_column_start pls_integer := null,
                           p_column_end   pls_integer := null,
                           p_row_start    pls_integer := null,
                           p_row_end      pls_integer := null,
                           p_sheet        pls_integer := null);

  --
  function finish return blob;

  --
  procedure save(p_directory varchar2, p_filename varchar2);

  --
  ---當p_footer設定參數為真,這個g_query2sheet_footer有值,則會顯示這個值的內容。沒有則預設是Generated xxxx
  ---有一點說明的是,&ROWS 欄位會被自動替換為結果返回的行數。
  g_query2sheet_footer varchar2(1000);

  g_query2sheet_rows   number; --結果返回的是多少行記錄
  --這個是這個程式的"完全體"
  procedure query2sheet(p_sql            varchar2,
                        p_col_value_tab  smt_xlsx_maker_pkg.tab_col_value ---運行的動態SQL的綁定變數
                       ,
                        p_column_headers boolean := true,
                        p_directory      varchar2 := null,
                        p_filename       varchar2 := null,
                        p_sheet          pls_integer := null,
                        p_footer         boolean := true,
                        x_retcode        out number ---0:成功  非0:失敗( 或者:0:成功  1:警告   2:錯誤  ----註意:確定警告的時候要做什麼動作)
                       ,
                        x_errbuf         out varchar2 ---具體的錯誤信息
                        );

  ---預設用上綁定變數的邏輯!
  procedure query2sheet(p_sql            varchar2,
                        p_column_headers boolean := true,
                        p_directory      varchar2 := null,
                        p_filename       varchar2 := null,
                        p_sheet          pls_integer := null,
                        p_footer         boolean := true,
                        x_retcode        out number ---0:成功  非0:失敗( 或者:0:成功  1:警告   2:錯誤  ----註意:確定警告的時候要做什麼動作)
                       ,
                        x_errbuf         out varchar2 ---具體的錯誤信息
                        );

  ---最簡單的使用版本
  procedure query2sheet(p_sql            varchar2,
                        p_column_headers boolean := true,
                        p_directory      varchar2 := null,
                        p_filename       varchar2 := null,
                        p_sheet          pls_integer := null,
                        p_footer         boolean := true);

  ---參考老外的,另外封裝的一個好用的過程!游標直接輸出excel。未測試過~
  procedure cursor2sheet(p_sql            in sys_refcursor,
                         p_column_headers boolean := true,
                         p_directory      varchar2 := null,
                         p_filename       varchar2 := null,
                         p_sheet          pls_integer := null,
                         p_footer         boolean := true);

  --
end;
smt_xlsx_maker_pkg 包頭部分

 

create or replace package body smt_xlsx_maker_pkg is

  --
  c_local_file_header        constant raw(4) := hextoraw('504B0304'); -- Local file header signature
  c_end_of_central_directory constant raw(4) := hextoraw('504B0506'); -- End of central directory signature
  --
  type tp_xf_fmt is record(
    numfmtid  pls_integer,
    fontid    pls_integer,
    fillid    pls_integer,
    borderid  pls_integer,
    alignment tp_alignment);

  type tp_col_fmts is table of tp_xf_fmt index by pls_integer;

  type tp_row_fmts is table of tp_xf_fmt index by pls_integer;

  type tp_widths is table of number index by pls_integer;

  type tp_cell is record(
    value number,
    style varchar2(50));

  type tp_cells is table of tp_cell index by pls_integer;

  type tp_rows is table of tp_cells index by pls_integer;

  type tp_autofilter is record(
    column_start pls_integer,
    column_end   pls_integer,
    row_start    pls_integer,
    row_end      pls_integer);

  type tp_autofilters is table of tp_autofilter index by pls_integer;

  type tp_hyperlink is record(
    cell varchar2(10),
    url  varchar2(1000));

  type tp_hyperlinks is table of tp_hyperlink index by pls_integer;

  subtype tp_author is varchar2(32767 char);

  type tp_authors is table of pls_integer index by tp_author;

  authors tp_authors;

  type tp_comment is record(
    text   varchar2(32767 char),
    author tp_author,
    row    pls_integer,
    column pls_integer,
    width  pls_integer,
    height pls_integer);

  type tp_comments is table of tp_comment index by pls_integer;

  type tp_mergecells is table of varchar2(21) index by pls_integer;

  type tp_validation is record(
    type             varchar2(10),
    errorstyle       varchar2(32),
    showinputmessage boolean,
    prompt           varchar2(32767 char),
    title            varchar2(32767 char),
    error_title      varchar2(32767 char),
    error_txt        varchar2(32767 char),
    showerrormessage boolean,
    formula1         varchar2(32767 char),
    formula2         varchar2(32767 char),
    allowblank       boolean,
    sqref            varchar2(32767 char));

  type tp_validations is table of tp_validation index by pls_integer;

  type tp_sheet is record(
    rows        tp_rows,
    widths      tp_widths,
    name        varchar2(100),
    freeze_rows pls_integer,
    freeze_cols pls_integer,
    autofilters tp_autofilters,
    hyperlinks  tp_hyperlinks,
    col_fmts    tp_col_fmts,
    row_fmts    tp_row_fmts,
    comments    tp_comments,
    mergecells  tp_mergecells,
    validations tp_validations);

  type tp_sheets is table of tp_sheet index by pls_integer;

  type tp_numfmt is record(
    numfmtid   pls_integer,
    formatcode varchar2(100));

  type tp_numfmts is table of tp_numfmt index by pls_integer;

  type tp_fill is record(
    patterntype varchar2(30),
    fgrgb       varchar2(8));

  type tp_fills is table of tp_fill index by pls_integer;

  type tp_cellxfs is table of tp_xf_fmt index by pls_integer;

  type tp_font is record(
    name      varchar2(100),
    family    pls_integer,
    fontsize  number,
    theme     pls_integer,
    rgb       varchar2(8),
    underline boolean,
    italic    boolean,
    bold      boolean);

  type tp_fonts is table of tp_font index by pls_integer;

  type tp_border is record(
    top    varchar2(17),
    bottom varchar2(17),
    left   varchar2(17),
    right  varchar2(17));

  type tp_borders is table of tp_border index by pls_integer;

  type tp_numfmtindexes is table of pls_integer index by pls_integer;

  type tp_strings is table of pls_integer index by varchar2(32767 char);

  type tp_str_ind is table of varchar2(32767 char) index by pls_integer;

  type tp_defined_name is record(
    name  varchar2(32767 char),
    ref   varchar2(32767 char),
    sheet pls_integer);

  type tp_defined_names is table of tp_defined_name index by pls_integer;

  type tp_book is record(
    sheets        tp_sheets,
    strings       tp_strings,
    str_ind       tp_str_ind,
    str_cnt       pls_integer := 0,
    fonts         tp_fonts,
    fills         tp_fills,
    borders       tp_borders,
    numfmts       tp_numfmts,
    cellxfs       tp_cellxfs,
    numfmtindexes tp_numfmtindexes,
    defined_names tp_defined_names);

  workbook tp_book;

  lc_rows  tp_rows; --new 2015.5.27
  --
  procedure debuglog(p_msg in varchar2) is
  begin
    if g_debug_type = 'DBMS_OUTPUT' then
      dbms_output.put_line(p_msg);
    elsif g_debug_type = 'FILE_OUTPUT' then
      --XYG_FND_FILE.PUT_LINE(FND_FILE.OUTPUT, P_MSG);
      null;
    elsif g_debug_type = 'REQUEST_OUTPUT' then
      --LOG(P_MSG);
      --FND_FILE.PUT_LINE (FND_FILE.LOG, P_MSG);
      null;
    end if;
  end debuglog;

  procedure blob2file(p_blob      blob,
                      p_directory varchar2 := 'MY_DIR',
                      p_filename  varchar2 := 'my.xlsx') is
    t_fh  utl_file.file_type;
    t_len pls_integer := 32767;
  begin
    t_fh := utl_file.fopen(p_directory, p_filename, 'wb');
    for i in 0 .. trunc((dbms_lob.getlength(p_blob) - 1) / t_len) loop
      utl_file.put_raw(t_fh, dbms_lob.substr(p_blob, t_len, i * t_len + 1));
    end loop;
    utl_file.fclose(t_fh);
  end;

  --
  function raw2num(p_raw raw, p_len integer, p_pos integer) return number is
  begin
    return utl_raw.cast_to_binary_integer(utl_raw.substr(p_raw,
                                                         p_pos,
                                                         p_len),
                                          utl_raw.little_endian);
  end;

  --
  function little_endian(p_big number, p_bytes pls_integer := 4) return raw is
  begin
    return utl_raw.substr(utl_raw.cast_from_binary_integer(p_big,
                                                           utl_raw.little_endian),
                          1,
                          p_bytes);
  end;

  --
  function blob2num(p_blob blob, p_len integer, p_pos integer) return number is
  begin
    return utl_raw.cast_to_binary_integer(dbms_lob.substr(p_blob,
                                                          p_len,
                                                          p_pos),
                                          utl_raw.little_endian);
  end;

  --
  procedure add1file(p_zipped_blob in out blob,
                     p_name        varchar2,
                     p_content     blob) is
    t_now        date;
    t_blob       blob;
    t_len        integer;
    t_clen       integer;
    t_crc32      raw(4) := hextoraw('00000000');
    t_compressed boolean :
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於安卓應用很廣泛,在工業中也常有一些應用,比如可以用安卓來去工業中的一些數據進行實現的監測,顯示,同時可以做一些自動化控制,當然在這裡,我不是做這些自動化控制方面的研究,只是做一個控制項,液位指示,其實就是繼承自progressbar,然後重新寫一測量與繪製,算是對自定義控制項進行一下複習。 我們要做
  • 單機搭建Android開發環境三,優化VMWare配置及Ubuntu系統,縮短Ubuntu開機時間,並提高其運行性能。
  •       最近項目中需要客戶端和Socket互相傳遞數據時候需要相互傳遞圖片所以做下總結以免以後忘記,也希望給大家帶來幫助。       先上客戶端的代碼:       根據圖片名稱上傳照相機中單個照片(此方法為自己封裝)       參數所代表的是照片的路徑。 註:在android Activi
  • 1. 三種創建線程的方法 //第一種      NSThread * thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(doAction) object:nil];     //線程名     thread1.nam
  • UISearchBar繼承自UIView、UIResponder、NSObject  autocapitalizationType————自動對輸入文本對象進行大小寫設置(包含4種類型,但是有時候鍵盤會屏蔽此屬性)  autocorrectionType————自動對輸入文本對象進行糾錯。  bac
  • 首先你要創建2個繼承自UIViewController的類 。 命名為FirstViewController和secondViewController。 首先在AppDelegate.h文件中引入頭文件      然後在AppDelegate.m中寫下 - (BOOL)application:(UI
  • 首先創建一個引導圖的控制器類 正文頁firstViewController.h和firstViewController.m AppDelegate.mAppDelegate.h文件 運行效果 第一次運行 第二次運行  
  •     好吧,首先我們來解釋一下什麼“點擊事件”,所謂“點擊事件”就是當我們點擊(註意是單擊)手機屏幕時,系統做出相應的響應;舉個例子哈,你去朋友家裡,要告訴你的朋友你到了,你是不是要敲一敲門,然後你朋友聽到了就來給你開門了,這個就和我們點擊屏幕上的Button很類似,點擊的操作相當於敲門,至於“朋
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...