SAP DOI EXCEL宏的使用
OAOR里上传EXCEL模版
屏幕初始化PBO创建DOI EXCEL对象,并填充EXCEL内容
*&---------------------------------------------------------------------*
*& Module INIT_DOI_DISPLAY_9100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE init_doi_display_9100 OUTPUT.
IF gc_container IS INITIAL.
PERFORM frm_doi_create USING gs_temp_name. "创建DOI对象
IF gs_mode <> 'U'.
PERFORM frm_fill_sheets_data . "填写SHEET数据
ENDIF.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FRM_DOI_OAOR_URL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ITEM_URL text
* -->P_I_TEMP_NAME text
*----------------------------------------------------------------------*
FORM frm_doi_oaor_url USING ev_url i_temp_name.
DATA lv_classname TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION'.
DATA lv_classtype TYPE sbdst_classtype VALUE 'OT'.
DATA lv_object_key TYPE sbdst_object_key VALUE 'ZFI'.
DATA lcl_instance TYPE REF TO cl_bds_document_set.
DATA lt_signature TYPE sbdst_signature.
DATA ls_signature LIKE LINE OF lt_signature.
DATA lt_components TYPE sbdst_components.
DATA lt_uris TYPE sbdst_uri.
DATA ls_uris LIKE LINE OF lt_uris.
"1.DESCRIPTION 根据描述定位模板
2.BDS_KEYWORD 根据关键字定位模板
ls_signature-prop_name = 'BDS_KEYWORD'.
ls_signature-prop_value = i_temp_name.
APPEND ls_signature TO lt_signature.
CREATE OBJECT lcl_instance.
CALL METHOD lcl_instance->get_info
EXPORTING
classname = lv_classname
classtype = lv_classtype
object_key = lv_object_key
CHANGING
components = lt_components
signature = lt_signature
EXCEPTIONS
nothing_found = 1
error_kpro = 2
internal_error = 3
parameter_error = 4
not_authorized = 5
not_allowed = 6.
CALL METHOD lcl_instance->get_with_url
EXPORTING
classname = lv_classname
classtype = lv_classtype
object_key = lv_object_key
CHANGING
uris = lt_uris
signature = lt_signature.
DATA lt_table TYPE sbdst_content.
CALL METHOD lcl_instance->get_with_table
EXPORTING
classname = lv_classname
classtype = lv_classtype
object_key = lv_object_key
CHANGING
content = lt_table
signature = lt_signature.
FREE lcl_instance.
SORT lt_uris BY doc_count DESCENDING.
READ TABLE lt_uris INTO ls_uris INDEX 1.
ev_url = ls_uris-uri.
ENDFORM. " FRM_DOI_OAOR_URL
*&---------------------------------------------------------------------*
*& Form FRM_DOI_CREATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_TEMP_NAME text
*----------------------------------------------------------------------*
FORM frm_doi_create USING i_temp_name.
DATA item_url TYPE c LENGTH 256.
DATA lv_filename TYPE string.
DATA lv_rc TYPE i.
DATA has TYPE i.
DATA: cl_splitter TYPE REF TO cl_gui_splitter_container,
cl_container TYPE REF TO cl_gui_container.
PERFORM frm_display_percent USING 1 '正在打开模板文件,请等待......' .
"创建DOI Control
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING
control = gi_control.
"创建CONTIANER
CREATE OBJECT gc_container
EXPORTING
container_name = 'CONTAINER_9100'.
CALL METHOD gi_control->init_control
EXPORTING
r3_application_name = 'XX平台报表'
inplace_enabled = 'X'
inplace_scroll_documents = 'X'
parent = gc_container
register_on_close_event = 'X'
register_on_custom_event = 'X'
no_flush = 'X'.
* 读取服务器上模板文件
IF gs_mode <> 'U'.
PERFORM frm_doi_oaor_url USING item_url i_temp_name. "OAOR里的EXCEL模版url 注:大模版打开可能很慢
ELSE.
item_url = gv_url.
ENDIF.
CALL METHOD gi_control->get_document_proxy
EXPORTING
document_type = 'Excel.Sheet'
no_flush = 'X'
IMPORTING
document_proxy = gi_document
error = gi_error.
"打开excel
CALL METHOD gi_document->open_document
EXPORTING
open_inplace = 'X'
no_flush = ''
document_url = item_url
IMPORTING
error = gi_error.
CALL METHOD gi_document->has_spreadsheet_interface
EXPORTING
no_flush = ''
IMPORTING
is_available = has.
CALL METHOD gi_document->get_spreadsheet_interface
EXPORTING
no_flush = ''
IMPORTING
sheet_interface = gi_spreadsheet.
IF gi_spreadsheet IS INITIAL.
MESSAGE '打开EXCEL失败,请删除任务管理器中的Excel进程再执行' TYPE 'S' DISPLAY LIKE 'E'.
REJECT.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_PERCENT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_100 text
* -->P_0024 text
*----------------------------------------------------------------------*
FORM frm_display_percent USING iv_percentage iv_msg.
DATA lv_text TYPE string.
WHILE gv_percentage < iv_percentage.
gv_percentage = gv_percentage + 1.
MESSAGE s001(00) WITH gv_percentage '%:' iv_msg INTO lv_text.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = lv_text
EXCEPTIONS
OTHERS = 1.
PERFORM frm_wait_seconds USING '0.01'.
ENDWHILE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_WAIT_SECONDS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0255 text
*----------------------------------------------------------------------*
FORM frm_wait_seconds USING iv_seconds TYPE p.
DATA lv_runtime1 TYPE i.
DATA lv_runtime2 TYPE i.
DATA lv_seconds TYPE i.
lv_seconds = iv_seconds * 1000000.
GET RUN TIME FIELD lv_runtime1.
WHILE lv_runtime2 - lv_runtime1 < lv_seconds.
GET RUN TIME FIELD lv_runtime2.
ENDWHILE.
ENDFORM.
填充EXCEL内容
*&---------------------------------------------------------------------*
*& Form FRM_FILL_SHEETS_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_fill_sheets_data.
DATA wa_sheet TYPE soi_sheets.
DATA lv_error TYPE REF TO i_oi_error.
CALL METHOD gi_spreadsheet->get_sheets
IMPORTING
sheets = gt_sheets
error = lv_error.
"读取excel异常
CALL METHOD lv_error->raise_message
EXPORTING
type = 'E'.
PERFORM frm_set_calculation USING 'False'. "关闭自动计算,提高代码执行效率
PERFORM frm_set_fn_corr_excel CHANGING gt_ztfi1249_b06. "☆重要:设置战役内表字段对应EXCEL列
PERFORM frm_get_excel_cols CHANGING gt_ztfi1249_b07. "EXCEL页签总列数
PERFORM frm_fill_sheet_data_0. "Sheet页签:0
LOOP AT gt_sheets INTO wa_sheet.
CASE wa_sheet-sheet_name.
WHEN '创利0'.
"创利0&全口径
PERFORM frm_copy_rows TABLES <dyn_table_z0> USING '创利0&全口径'. "复制插入行
PERFORM frm_fill_sheet_data TABLES <dyn_table_z0> USING '创利0&全口径'.
"创利0&权益
PERFORM frm_copy_rows TABLES <dyn_table_z0_1> USING '创利0&权益'. "复制插入行
PERFORM frm_fill_sheet_data TABLES <dyn_table_z0_1> USING '创利0&权益'.
WHEN '战役1'.
PERFORM frm_copy_rows TABLES <dyn_table_z1> USING wa_sheet-sheet_name. "复制插入行
PERFORM frm_fill_sheet_data TABLES <dyn_table_z1> USING wa_sheet-sheet_name.
WHEN '1.1'.
PERFORM frm_copy_rows TABLES <dyn_table_1_1> USING wa_sheet-sheet_name. "复制插入行
PERFORM frm_fill_sheet_data TABLES <dyn_table_1_1> USING wa_sheet-sheet_name.
WHEN '2.1'.
PERFORM frm_copy_rows TABLES <dyn_table_2_1> USING wa_sheet-sheet_name. "复制插入行
PERFORM frm_fill_sheet_data TABLES <dyn_table_2_1> USING wa_sheet-sheet_name.
ENDCASE.
ENDLOOP.
CALL METHOD gi_spreadsheet->select_sheet( EXPORTING no_flush = 'X' name = '创利0').
PERFORM frm_default_selection USING '创利0&全口径'. "默认光标选中行
* PERFORM frm_hide_sheet. "隐藏页签
PERFORM frm_set_calculation USING 'True'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_CALCULATION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0033 text
*----------------------------------------------------------------------*
FORM frm_set_calculation USING iv_flag.
CALL METHOD gi_document->execute_macro
EXPORTING
macro_string = '模块1.set_calculation'
no_flush = 'X'
param_count = 1
param1 = iv_flag
IMPORTING
error = gi_error.
ENDFORM.
FORM frm_set_fn_corr_excel CHANGING VALUE(ct_ztfi1249_b06) TYPE ztfi1249_b06_tab.
"页签字段对应EXCEL列(用于输出和保存)
IF ct_ztfi1249_b06 IS INITIAL.
SELECT * INTO TABLE ct_ztfi1249_b06 FROM ztfi1249_b06.
IF sy-subrc = 0.
SORT ct_ztfi1249_b06 BY sheet_name column_excel range.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FN_CORR_EXCEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_excel_cols CHANGING VALUE(ct_ztfi1249_b07) TYPE ztfi1249_b07_tab.
" EXCEL页签总列数
IF ct_ztfi1249_b07 IS INITIAL.
SELECT * INTO TABLE ct_ztfi1249_b07 FROM ztfi1249_b07.
IF sy-subrc = 0.
SORT ct_ztfi1249_b07 BY sheet_name.
ENDIF.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
FORM frm_fill_sheet_data_0.
DATA lv_col TYPE string.
DATA lv_row TYPE i.
"选中页签 【 0 】
CALL METHOD gi_spreadsheet->select_sheet( EXPORTING no_flush = 'X' name = '0'). "先要选中填数页签,否则数据填不进去
PERFORM frm_setcellvalue01 USING 'B4' gs_ztfi1249_01-byear. "版本年度
PERFORM frm_setcellvalue01 USING 'B5' gs_ztfi1249_01-mont. "版本月份
* SORT gt_tbgs BY pinyin.
* LOOP AT gt_tbgs INTO DATA(gs_tbgs).
* lv_row = 3 + sy-tabix.
*
* lv_col = |E{ lv_row }|.
* PERFORM frm_setcellvalue01 USING lv_col gs_tbgs-tbgs. "组织编码
*
* lv_col = |F{ lv_row }|.
* PERFORM frm_setcellvalue01 USING lv_col gs_tbgs-tbgsnm. "组织名称
* ENDLOOP.
ENDFORM.
*----------------------------------------------------------------------*
FORM frm_setcellvalue01 USING iv_cell iv_value.
CALL METHOD gi_document->execute_macro
EXPORTING
macro_string = '模块1.SetCellValue01'
param_count = 2
param1 = iv_cell
param2 = iv_value
no_flush = 'X'
IMPORTING
error = gi_error.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_COPY_ROWS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_<DYN_TABLE_Z1> text
*----------------------------------------------------------------------*
FORM frm_copy_rows TABLES pt_excel
USING VALUE(iv_sheet_name) TYPE soi_field_name.
* VALUE(iv_copy_c) TYPE i "复制行
* VALUE(iv_copy_i) TYPE i. "插入行
DATA l_iref_error TYPE REF TO i_oi_error.
DATA lv_lines TYPE i.
DATA lv_copy_c TYPE i. "复制行
DATA lv_copy_i TYPE i. "插入行
DATA lv_sheet_name TYPE soi_field_name.
DATA lv_info TYPE char80.
* ☆☆☆☆☆比如:复制第5行,则需要在第6行插入,此时插入行才在下面。☆☆☆☆☆☆☆
"*// 起始行
READ TABLE gt_ztfi1249_b07 INTO DATA(gs_b07) WITH KEY sheet_name = iv_sheet_name BINARY SEARCH.
CASE iv_sheet_name.
WHEN '创利0&权益'.
DESCRIBE TABLE pt_excel LINES DATA(lv_lines_qy).
IF lv_lines_qy > 1.
* lv_copy_c = gv_end_row_z0 + 4. "复制行
lv_copy_c = gv_end_row_z0 + 5. "复制行
ELSE.
lv_copy_c = gv_end_row_z0 + 5. "复制行
ENDIF.
* lv_copy_c = gv_end_row_z0 + 5. "复制行
lv_copy_i = lv_copy_c + 1. "插入行
WHEN OTHERS.
lv_copy_c = gs_b07-start_row. "复制行
lv_copy_i = lv_copy_c + 1. "插入行
ENDCASE.
lv_sheet_name = iv_sheet_name.
IF lv_sheet_name CS '创利0'.
lv_sheet_name = '创利0'.
ENDIF.
lv_info = '正在填充数据:' && lv_sheet_name.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = lv_info.
"Activate a Sheet
CALL METHOD gi_spreadsheet->select_sheet
EXPORTING
no_flush = 'X'
name = lv_sheet_name
IMPORTING
error = l_iref_error.
"复制插入行
lv_lines = lines( pt_excel ).
IF iv_sheet_name = cns_sheetname8_1 OR iv_sheet_name = cns_sheetname8_1.
lv_lines = lv_lines.
ELSE.
lv_lines = lv_lines - 1.
ENDIF.
* CHECK lv_lines > 1.
CHECK lv_lines > 0.
* CALL METHOD gi_document->execute_macro
* EXPORTING
* macro_string = '模块1.SelectSheet'
* no_flush = 'X'
* param_count = 1
* param1 = iv_sheet_name
* IMPORTING
* error = gi_error.
DO lv_lines TIMES.
CALL METHOD gi_document->execute_macro
EXPORTING
macro_string = '模块1.Copy_Row_1'
no_flush = 'X'
param_count = 2
param1 = lv_copy_c "复制行 如:复制第5行,则需要在第6行插入,此时插入行才在下面。
param2 = lv_copy_i "插入行
IMPORTING
error = gi_error.
lv_copy_c = lv_copy_c + 1.
lv_copy_i = lv_copy_i + 1.
ENDDO.
ENDFORM.
* -->P_<DYN_TABLE1_1> text
*----------------------------------------------------------------------*
FORM frm_fill_sheet_data TABLES pt_table
USING VALUE(p_sheetname) TYPE soi_field_name.
DATA lv_lines TYPE i. "总行数
DATA lv_row_start TYPE i. "起始行
DATA lv_row_end TYPE i. "结束行
DATA lv_col_start TYPE i. "起始列
DATA lv_col_end TYPE i. "结束列
DATA lt_ztfi1249_b06 TYPE STANDARD TABLE OF ztfi1249_b06.
DATA lt_range TYPE STANDARD TABLE OF ztfi1249_b06.
DATA lt_date_format TYPE STANDARD TABLE OF ztfi1249_b06.
DATA lt_range_1 TYPE STANDARD TABLE OF ztfi1249_b06.
DATA lt_range_s TYPE STANDARD TABLE OF ztfi1249_b06.
DATA lt_range_e TYPE STANDARD TABLE OF ztfi1249_b06.
IF p_sheetname = '创利0&全口径'.
CLEAR gv_end_row_z0.
ENDIF.
lt_ztfi1249_b06 = gt_ztfi1249_b06.
DELETE lt_ztfi1249_b06 WHERE sheet_name <> p_sheetname.
DELETE lt_ztfi1249_b06 WHERE zoutput = ''. "排除不输出字段
lt_date_format = lt_ztfi1249_b06.
DELETE lt_date_format WHERE date_format = ''. "日期格式与转换字段,删除无配置字段
SORT lt_date_format BY fieldname.
"数据行数
DESCRIBE TABLE pt_table LINES lv_lines.
"获取当前页签字段
CLEAR lt_range.
lt_range = lt_ztfi1249_b06.
"*// 起始行
READ TABLE gt_ztfi1249_b07 INTO DATA(gs_b07) WITH KEY sheet_name = p_sheetname BINARY SEARCH.
"按 range 范围输出,所以需要去除重复,取范围(单列也算一个范围)
SORT lt_range BY range.
DELETE ADJACENT DUPLICATES FROM lt_range COMPARING range.
LOOP AT lt_range INTO DATA(ls_range).
CLEAR lt_range_s.
lt_range_s = lt_ztfi1249_b06.
DELETE lt_range_s WHERE range <> ls_range-range.
CLEAR lt_range_e.
lt_range_e = lt_ztfi1249_b06.
DELETE lt_range_e WHERE range <> ls_range-range.
SORT lt_range_s BY column_excel.
SORT lt_range_e BY column_excel DESCENDING.
READ TABLE lt_range_s INTO DATA(ls_range_s) INDEX 1. "起始列
READ TABLE lt_range_e INTO DATA(ls_range_e) INDEX 1. "结束列
CLEAR lv_row_start.
CLEAR lv_row_end.
CLEAR lv_col_start.
CLEAR lv_col_end.
lv_row_start = gs_b07-start_row. "起始行
lv_row_end = lv_lines + gs_b07-start_row - 1. "结束行
lv_col_start = ls_range_s-column_excel. "起始列
lv_col_end = ls_range_e-column_excel. "结束列
IF p_sheetname = '创利0&全口径'.
gv_end_row_z0 = lv_row_end.
ELSEIF p_sheetname = '创利0&权益'.
lv_row_start = gv_end_row_z0 + 2 + 2 + 1. "创利0&权益: 起始行 = 创利0&全口径 结束行 + 创利0&全口径 1行 合计 (包含1空行) + 权益抬头2行 + 自身1行
lv_row_end = gv_end_row_z0 + 2 + 2 + lv_lines. "创利0&权益:结束行 = 创利0&全口径 结束行 + 创利0&全口径 1行 合计 (包含1空行) + 权益抬头2行 + 创利0&权益 总行数
ENDIF.
"输出结果
PERFORM frm_doi_set_range USING gi_spreadsheet lv_row_start lv_row_end lv_col_start lv_col_end 'RANGE' gt_ranges. "设置输出range
PERFORM frm_doi_range_data_sheet TABLES pt_table USING lt_range_s lt_date_format. "设置输出内表值
PERFORM frm_doi_fill_ranges USING gi_spreadsheet gt_ranges gt_excel_input. "填充到EXCEL指定位置
CLEAR ls_range_s.
CLEAR ls_range_e.
ENDLOOP.
PERFORM frm_hide_row_columns USING p_sheetname. "隐藏列 或 行
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOI_SET_RANGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GI_SPREADSHEET text
* -->P_3 text
* -->P_LV_END_ROW text
* -->P_2 text
* -->P_8 text
* -->P_0455 text
* -->P_GT_RANGES text
*----------------------------------------------------------------------*
FORM frm_doi_set_range USING io_spreadsheet TYPE REF TO i_oi_spreadsheet
row_start TYPE i "起始行
row_end TYPE i "结束行
col_start TYPE i "起始列
col_end TYPE i "结束列
name TYPE any
et_ranges TYPE soi_range_list.
DATA: lv_cols TYPE i,
lv_rows TYPE i,
lv_tabix TYPE sy-tabix,
ls_ranges TYPE LINE OF soi_range_list.
CLEAR gt_ranges.
"数据行数列数
lv_rows = row_end - row_start + 1.
lv_cols = col_end - col_start + 1.
CALL METHOD io_spreadsheet->insert_range_dim
EXPORTING
name = name
no_flush = 'X'
top = row_start "起始行
left = col_start "起始列
rows = lv_rows "结束行
columns = lv_cols. "结束列
ls_ranges-name = name.
ls_ranges-columns = lv_cols.
ls_ranges-rows = lv_rows.
ls_ranges-code = 4.
APPEND ls_ranges TO et_ranges.
ENDFORM. "frm_doi_insert_range
*&---------------------------------------------------------------------*
*& Form FRM_DOI_RANGE_DATA_SHEET1_1
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_PT_TABLE text
*----------------------------------------------------------------------*
FORM frm_doi_range_data_sheet TABLES p_table
USING VALUE(lt_range_s) TYPE ztfi1249_b06_tab
VALUE(lt_date_format) TYPE ztfi1249_b06_tab.
DATA lv_row TYPE i.
DATA lv_column TYPE i.
DATA ls_excel_input TYPE LINE OF soi_generic_table.
DATA lv_tabname TYPE tabname.
DATA lv_fieldname TYPE string.
DATA lt_flds TYPE dd03ptab.
DATA ls_flds TYPE dd03p.
DATA:dny_tab_temp TYPE REF TO data.
FIELD-SYMBOLS:<dny_tab_temp> TYPE STANDARD TABLE.
"清空
CLEAR gt_excel_input.
"读取结构
READ TABLE lt_range_s INTO DATA(ls_range_s) INDEX 1.
IF sy-subrc = 0.
lv_tabname = ls_range_s-ddobjname.
ENDIF.
"没有配置结构,则退出,防止DUMP
IF lv_tabname IS INITIAL.
RETURN.
ENDIF.
"根据结构创建动态内表
CLEAR lt_flds.
zcl_pubfm=>get_dyntab( EXPORTING iv_tabn = lv_tabname
IMPORTING er_tabl = dny_tab_temp
et_flds = lt_flds ).
"实例化指针,赋值给动态内表
ASSIGN dny_tab_temp->* TO <dny_tab_temp>.
IF p_table[] IS INITIAL. RETURN. ENDIF.
APPEND LINES OF p_table TO <dny_tab_temp>.
SORT lt_flds BY fieldname inttype.
"赋值给输出内表
LOOP AT <dny_tab_temp> ASSIGNING FIELD-SYMBOL(<ls_table>).
lv_row = lv_row + 1.
lv_column = 0.
LOOP AT lt_range_s INTO ls_range_s.
lv_column = lv_column + 1.
lv_fieldname = ls_range_s-fieldname.
"判断:是否存在日期格式与转换字段,如果存在则取转换字段值
READ TABLE lt_date_format INTO DATA(ls_date_format) WITH KEY fieldname = ls_range_s-fieldname BINARY SEARCH.
IF sy-subrc = 0.
SPLIT ls_date_format-date_format AT '&' INTO: lv_fieldname DATA(lv_sym).
ENDIF.
"转换字段1(用于区分0和空)
IF ls_range_s-fieldname_conv1 IS NOT INITIAL.
lv_fieldname = ls_range_s-fieldname_conv1.
ENDIF.
ASSIGN COMPONENT lv_fieldname OF STRUCTURE <ls_table> TO FIELD-SYMBOL(<lv_val>).
IF sy-subrc = 0.
ls_excel_input-row = lv_row.
ls_excel_input-column = lv_column.
ls_excel_input-value = <lv_val>.
CONDENSE ls_excel_input-value.
"负号提前
READ TABLE lt_flds INTO ls_flds WITH KEY fieldname = lv_fieldname
inttype = 'P'
BINARY SEARCH.
IF sy-subrc = 0.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = ls_excel_input-value.
ENDIF.
APPEND ls_excel_input TO gt_excel_input.
CLEAR ls_excel_input.
ENDIF.
ENDLOOP.
ENDLOOP.
FREE <dny_tab_temp>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOI_FILL_RANGES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GI_SPREADSHEET text
* -->P_GT_RANGES text
* -->P_GT_EXCEL_INPUT text
*----------------------------------------------------------------------*
FORM frm_doi_fill_ranges USING io_spreadsheet TYPE REF TO i_oi_spreadsheet
it_ranges TYPE soi_range_list
it_tab TYPE soi_generic_table.
DATA cl_errors TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.
CALL METHOD io_spreadsheet->set_ranges_data
EXPORTING
ranges = it_ranges
contents = it_tab
no_flush = 'X'
IMPORTING
error = cl_errors.
ENDFORM.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_hide_row_columns USING VALUE(p_sheetname) TYPE soi_field_name.
CASE p_sheetname.
WHEN cns_sheetname1_1
OR cns_sheetname1_2
OR cns_sheetname2_1
OR cns_sheetname2_2
OR cns_sheetname3_1
OR cns_sheetname3_2
OR cns_sheetname3_3
OR cns_sheetname4_1
OR cns_sheetname4_2
OR cns_sheetname5_1.
PERFORM frm_hide_columns USING 'A'.
PERFORM frm_hide_columns USING 'B'.
PERFORM frm_hide_columns USING 'C'.
PERFORM frm_hide_columns USING 'D'.
PERFORM frm_hide_columns USING 'E'.
PERFORM frm_hide_rows USING '1'.
ENDCASE.
ENDFORM.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_hide_columns USING iv_cell.
CALL METHOD gi_document->execute_macro
EXPORTING
macro_string = '模块1.HideColumns'
no_flush = 'X'
param_count = 1
param1 = iv_cell
IMPORTING
error = gi_error.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HIDE_COLUMNS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_hide_rows USING iv_row.
CALL METHOD gi_document->execute_macro
EXPORTING
macro_string = '模块1.HideRows'
no_flush = 'X'
param_count = 1
param1 = iv_row
IMPORTING
error = gi_error.
ENDFORM.
*&--------
*----------------------------------------------------------------------*
FORM frm_default_selection USING pv_sheet_name.
DATA lv_column_str TYPE zexcel_cell_column_alpha.
DATA lv_str TYPE string.
DATA lv_row TYPE i.
READ TABLE gt_ztfi1249_b06 INTO DATA(gs_b06) WITH KEY sheet_name = pv_sheet_name fieldname = 'HCODE'.
READ TABLE gt_ztfi1249_b07 INTO DATA(gs_b07) WITH KEY sheet_name = pv_sheet_name BINARY SEARCH.
lv_row = gs_b07-start_row - 1.
IF lv_row <= 0.
RETURN.
ENDIF.
lv_column_str = zcl_excel_common=>convert_column2alpha( gs_b06-column_excel ). "数字转换字母
lv_str = | { lv_column_str }{ lv_row }|. "第几列 第几行 如A1
CONDENSE lv_str NO-GAPS.
"默认光标选中列
CALL METHOD gi_document->execute_macro
EXPORTING
macro_string = '模块1.SelectCell'
no_flush = 'X'
param_count = 1
param1 = lv_str
IMPORTING
error = gi_error.
* CALL METHOD gi_spreadsheet->set_selection
* EXPORTING
* left = 6 "从第几列开始
* top = 3 "从第几行开始
* rows = 1 "结束行
* columns = 1 "列数
* no_flush = 'X'.
ENDFORM.
method CONVERT_COLUMN2ALPHA.
DATA: lv_uccpi TYPE i,
lv_text TYPE sychar02,
lv_module TYPE int4,
lv_column TYPE zexcel_cell_column.
* Propagate zcx_excel if error occurs " issue #155 - less restrictive typing for ip_column
lv_column = convert_column2int( ip_column ). " issue #155 - less restrictive typing for ip_column
*--------------------------------------------------------------------*
* Check whether column is in allowed range for EXCEL to handle ( 1-16384 )
*--------------------------------------------------------------------*
IF lv_column > 16384
OR lv_column < 1.
RAISE EXCEPTION TYPE zcx_excel
EXPORTING
error = 'Index out of bounds'.
ENDIF.
*--------------------------------------------------------------------*
* Build alpha representation of column
*--------------------------------------------------------------------*
WHILE lv_column GT 0.
lv_module = ( lv_column - 1 ) MOD 26.
lv_uccpi = 65 + lv_module.
lv_column = ( lv_column - lv_module ) / 26.
lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ).
CONCATENATE lv_text ep_column INTO ep_column.
ENDWHILE.
endmethod.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_SET_CALCULATION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0033 text
*----------------------------------------------------------------------*
FORM frm_set_calculation USING iv_flag.
CALL METHOD gi_document->execute_macro
EXPORTING
macro_string = '模块1.set_calculation'
no_flush = 'X'
param_count = 1
param1 = iv_flag
IMPORTING
error = gi_error.
ENDFORM.
Sub Copy_Line(start_range As String, end_range As String)
If end_range <> start_range Then
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Range(start_range).Select
Selection.AutoFill Destination:=Range(end_range)
Application.CutCopyMode = False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End If
End Sub
Sub set_calculation(flag As String)
If flag = "False" Then
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Else
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End If
End Sub
'选择Sheet页签
Sub SelectSheet(SheetName As String)
Sheets(SheetName).Select
End Sub
'选中单元格
Sub SelectCell(cell As String)
Dim Str As String
Str = cell & ":" & cell
Range(Str).Select
End Sub
'隐藏列
Sub HideColumns(cell As String)
Dim Str As String
Str = cell & ":" & cell
Columns(Str).Select
Selection.EntireColumn.Hidden = True
End Sub
'隐藏行
Sub HideRows(row As String)
Dim Str As String
Str = row & ":" & row
Rows(Str).Select
Selection.EntireRow.Hidden = True
End Sub
'测试宏
Sub test()
Call setcolor(1, 1, 1, 1, 217, 217, 217)
End Sub
'隐藏
Sub hidemenu()
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
Application.ScreenUpdating = True
End Sub
'显示
Sub showmenu()
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
Application.ScreenUpdating = True
End Sub
'设置区域属性
Sub setcolor(StartRow As Long, endRow As Long, StartCol As Long, EndCol As Long, R As Long, G As Long, B As Long)
Range(Cells(StartRow, StartCol), Cells(endRow, EndCol)).Select
Selection.Interior.Color = RGB(R, G, B)
End Sub
'隐藏sheet
Sub HideSheet(SheetName As String)
Sheets(SheetName).Visible = False
End Sub
'显示Sheet
Sub DisplaySheet(SheetName As String)
Sheets(SheetName).Visible = True
End Sub
'设置超链接
Sub SetHyper(cell As String, SubAddress As String)
Range(cell).Select
Selection.Hyperlinks(1).SubAddress = SubAddress
End Sub
'单元格赋值
Sub SetCellValue01(cell As String, Value As String)
Range(cell).Select
ActiveCell.FormulaR1C1 = Value
End Sub
'单元格赋值(公式不会转换为字符串)
Sub SetCellValue02(row As Long, Col As Long, Value As String)
Cells(row, Col) = Value
End Sub
'复制并插入一行
Sub Copy_Row(row As Integer)
Rows(row).Select
Selection.Copy
Selection.Insert Shift:=xlDown
End Sub
'复制并插入一行
Sub Copy_Row_1(row_c As Integer, row_i As Integer)
Dim Str_c As String
Dim Str_i As String
Str_c = row_c & ":" & row_c
Str_i = row_i & ":" & row_i
Rows(row_c).Select
Selection.Copy
Rows(row_i).Select
Selection.Insert Shift:=xlDown
End Sub
'插入一行
Sub Insert_Row(row As Integer)
Dim Str As String
Str = row & ":" & row
Rows(Str).Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End Sub
'复制并插入列
Sub Copy_column(Col As String)
Dim Str As String
Str = Col & ":" & Col
Range(Str).Copy
Range(Str).Insert Shift:=xlShiftToRight
End Sub
'删除一行
Sub Del_Line(row As Integer)
Rows(row).Select
Selection.Delete Shift:=xlUp
End Sub
'清空区域数据
Sub Clear_Area(Area As String)
Range(Area).Select
Selection.ClearContents
Range("A1").Select
End Sub
'保护工作簿
Sub Protect_WorkBook(Locked As String)
Dim icnt As Long
Dim i As Long
icnt = Worksheets.Count
For i = 1 To icnt
Sheets(i).Cells.Locked = Locked
Next i
End Sub
'保护区域
Sub Protect_Range(StartRow As Long, endRow As Long, StartCol As Long, EndCol As Long, Locked As String)
Range(Cells(StartRow, StartCol), Cells(endRow, EndCol)).Select
Selection.Locked = Locked
Range("A1").Select
End Sub
'保护区域2
Sub Protect_Range2(cell As String, Locked As String)
Range(cell).Select
Selection.Locked = Locked
Range("A1").Select
End Sub
'添加备注
Sub Addcomment(row As Integer, Col As Integer, commtitle As String, commcontent As String)
Range(Cells(row, Col), Cells(row, Col)).Select
With Selection
.Addcomment
.Comment.Visible = False
.Comment.Text Text:=commtitle & Chr(10) & commcontent
End With
End Sub
'修改备注
Sub Modcomment(row As Integer, Col As Integer, commtitle As String, commcontent As String)
Range(Cells(row, Col), Cells(row, Col)).Select
With Selection
.Comment.Text Text:=commtitle & Chr(10) & commcontent
End With
End Sub
'删除备注
Sub Delcomment(row As Integer, Col As Integer)
Range(Cells(row, Col), Cells(row, Col)).Select
With Selection
.ClearComments
End With
End Sub
'合并单元格
Sub MergeCell(StartRow As Integer, StartCol As Integer, endRow As Integer, EndCol As Integer)
Range(Cells(StartRow, StartCol), Cells(endRow, EndCol)).Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
End Sub
'ENTER操作
Sub Enter()
Selection.Offset(1, 0).Select
End Sub
'保存操作
Sub Save()
ActiveWorkbook.Save
End Sub
'超链接
Sub hyperlink(Value As String, Url As String)
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=Url, TextToDisplay:=Value
End Sub
'刷新透视表
Sub refresh_pivot(Count As Integer)
Dim i As Long
ActiveSheet.Unprotect Password:="VK1234"
For i = 1 To Count
ActiveSheet.PivotTables(i).PivotCache.Refresh
Next i
End Sub
'设置日期格式
Sub ref_date(cols As String)
Columns(cols).Select
Selection.NumberFormatLocal = "yyyy/m/d"
End Sub
'获取活动工作表的行数
Sub GetRowCount(SheetName As String, ByRef ret_value As String)
Set ws = ThisWorkbook.Sheets(SheetName)
ret_value = ws.UsedRange.Rows.Count
End Sub
'将公式转为值
Sub valtoval()
'转换之前备份
Filename = ActiveWorkbook.Name
'获取当前工作簿后缀的名称
hname = Right(ThisWorkbook.Name, Len(ThisWorkbook.Name) - InStr(ThisWorkbook.Name, "."))
If hname = "xlsm" Then
pth = ThisWorkbook.Path & "\" & Replace(Filename, ".xlsm", "_转换.xlsm")
ActiveWorkbook.SaveAs Filename:=pth, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End If
If hname = "xlsb" Then
pth = ThisWorkbook.Path & "\" & Replace(Filename, ".xlsb", "_转换.xlsb")
ActiveWorkbook.SaveAs Filename:=pth, FileFormat:=xlExcel12, CreateBackup:=False
End If
'转换公式
For Each sh In Sheets
sh.AutoFilterMode = False
sh.UsedRange.Value = sh.UsedRange.Value
Next
MsgBox "ok"
End Sub
'在选中行下插入空行且复制公式
Sub InsertRowCopyContentAndDeleteNonFormula()
Dim activeSheetName As String
Dim selectedRow As Long
Dim lastColumn As Long
Dim formulaRange As Range
Dim cell As Range
Dim searchValue As String
Dim foundCell As Range
Dim row As String
' 设置要搜索的值
searchValue = "合计"
' 在整个工作表范围内搜索包含指定值的单元格
Set foundCell = Cells.Find(What:=searchValue, LookIn:=xlValues, LookAt:=xlWhole)
If Not foundCell Is Nothing Then
row = foundCell.row - 2
End If
' 获取当前活动页签的名称
activeSheetName = ActiveSheet.Name
' 获取当前选中行的行号
selectedRow = Selection.row
' 检查选中行是否小于第5行
If activeSheetName = "1.1" Or activeSheetName = "1.2" Or activeSheetName = "2.1" Or activeSheetName = "2.2" Or activeSheetName = "3.1" Or activeSheetName = "3.2" Or activeSheetName = "3.3" Or activeSheetName = "4.1" Or activeSheetName = "4.2" Or activeSheetName = "5.1" Then
If selectedRow < 5 Or selectedRow > row Then
MsgBox "请将光标放在第5行(含)和第" & row & "行(含)之间内再插入!", vbExclamation
Exit Sub
End If
End If
' 检查页签5.2、6.1、7.1、7.2选中行是否小于第4行
If activeSheetName = "5.2" Or activeSheetName = "6.1" Or activeSheetName = "7.1" Or activeSheetName = "7.2" Then
If selectedRow < 4 Or selectedRow > row Then
MsgBox "请将光标放在第4行(含)和第" & row & "行(含)之间内再插入!", vbExclamation
Exit Sub
End If
End If
' 检查页签5.3选中行是否小于第3行
If activeSheetName = "5.3" Then
If selectedRow < 3 Or selectedRow > row Then
MsgBox "请将光标放在第3行(含)和第" & row & "行(含)之间内再插入!", vbExclamation
Exit Sub
End If
End If
' 检查页签8.1、8.2选中行是否小于第3行
If activeSheetName = "8.1" Or activeSheetName = "8.2" Then
If selectedRow < 3 Then
MsgBox "请将光标放在第3行(含)之后再插入!", vbExclamation
Exit Sub
End If
End If
' 获取当前选中行的最后一列列号
lastColumn = Cells(selectedRow, Columns.Count).End(xlToLeft).Column
' 将选中行下方插入一行
Rows(selectedRow + 1).Insert Shift:=xlDown
' 复制选中行的内容
Range(Cells(selectedRow, 1), Cells(selectedRow, lastColumn)).Copy Destination:=Cells(selectedRow + 1, 1)
' 删除插入行单元格中没有公式的内容(除了A到E列)
For Each cell In Range(Cells(selectedRow + 1, 1), Cells(selectedRow + 1, lastColumn))
If activeSheetName = "1.1" Or activeSheetName = "1.2" Or activeSheetName = "2.1" Or activeSheetName = "2.2" Or activeSheetName = "3.1" Or activeSheetName = "3.2" Or activeSheetName = "3.3" Or activeSheetName = "4.1" Or activeSheetName = "4.2" Or activeSheetName = "5.1" Then
If cell.Column < 1 Or cell.Column > 5 Then
If Left(cell.Formula, 1) <> "=" Then
cell.ClearContents
End If
End If
End If
If activeSheetName = "5.2" Or activeSheetName = "5.3" Or activeSheetName = "6.1" Or activeSheetName = "7.1" Or activeSheetName = "7.2" Or activeSheetName = "8.1" Or activeSheetName = "8.2" Then
If Left(cell.Formula, 1) <> "=" Then
cell.ClearContents
End If
End If
Next cell
End Sub
'删除选中行
Sub DeleteSelectedRowsWithConfirmation()
Dim activeSheetName As String
Dim selectedRow As Long
Dim foundCell As Range
Dim row As String
Dim response As VbMsgBoxResult
Dim searchValue As String
' 设置要搜索的值
searchValue = "合计"
' 在整个工作表范围内搜索包含指定值的单元格
Set foundCell = Cells.Find(What:=searchValue, LookIn:=xlValues, LookAt:=xlWhole)
If Not foundCell Is Nothing Then
row = foundCell.row - 2
End If
' 获取当前活动页签的名称
activeSheetName = ActiveSheet.Name
' 获取当前选中行的行号
selectedRow = Selection.row
' 检查选中行是否小于第5行
If activeSheetName = "1.1" Or activeSheetName = "1.2" Or activeSheetName = "2.1" Or activeSheetName = "2.2" Or activeSheetName = "3.1" Or activeSheetName = "3.2" Or activeSheetName = "3.3" Or activeSheetName = "4.1" Or activeSheetName = "4.2" Or activeSheetName = "5.1" Then
If selectedRow < 5 Or selectedRow > row Then
MsgBox "只允许删除第5行(含)和第" & row & "行(含)之间的行!", vbExclamation
Exit Sub
End If
End If
' 检查页签5.2、6.1、7.1、7.2选中行是否小于第4行
If activeSheetName = "5.2" Or activeSheetName = "6.1" Or activeSheetName = "7.1" Or activeSheetName = "7.2" Then
If selectedRow < 4 Or selectedRow > row Then
MsgBox "只允许删除第4行(含)和第" & row & "行(含)之间行!", vbExclamation
Exit Sub
End If
End If
' 检查页签5.3选中行是否小于第3行
If activeSheetName = "5.3" Then
If selectedRow < 3 Or selectedRow > row Then
MsgBox "只允许删除第3行(含)和第" & row & "行(含)之间行!", vbExclamation
Exit Sub
End If
End If
' 检查页签8.1、8.2选中行是否小于第3行
If activeSheetName = "8.1" Or activeSheetName = "8.2" Then
If selectedRow < 3 Then
MsgBox "只允许删除第3行(含)之后行!", vbExclamation
Exit Sub
End If
End If
' 提示用户是否需要删除选中的行
response = MsgBox("确定要删除选中的行吗?", vbQuestion + vbYesNo, "确认删除")
' 检查用户的回答
If response = vbYes Then
On Error Resume Next
Selection.EntireRow.Delete
On Error GoTo 0
End If
End Sub
相关文章:
SAP DOI EXCEL宏的使用
OAOR里上传EXCEL模版 屏幕初始化PBO创建DOI EXCEL对象,并填充EXCEL内容 *&---------------------------------------------------------------------* *& Module INIT_DOI_DISPLAY_9100 OUTPUT *&--------------------------------------------…...
VSTO(C#)Excel开发3:Range对象 处理列宽和行高
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
单链表基本操作的实现与解析(补充)
目录 一、引言 二、代码实现 遍历考虑情况 三、操作解析 查找操作(sltfind函数) 前插操作(sltinsert函数) 后插操作(sltinsertafter函数) 前删操作(slterase函数) 后删操作&…...
电子学会—2024年月6青少年软件编程(图形化)四级等级考试真题——魔法门
魔法门 1.准备工作 (1)保留默认角色小猫和白色背景; (2)添加角色Home Button,复制9个造型,在每个造型上分别加上数字1到9,如下图所示; 2.功能实现 (1)程序开始,依次克隆出五个Home Button,克隆体之间的间距为90; …...
《加快应急机器人发展的指导意见》中智能化升级的思考——传统应急设备智能化升级路径与落地实践
感谢阅读本次内容分享,下面我将解读分析《加快应急机器人发展的指导意见》,喜欢的点赞支持一下呗~(日更真的很辛苦~),欢迎评论区留言讨论,你们的发言我都会看到~ 《加快应急机器人发展的指导意见》中智能化升级的思考——传统应急…...
Git系列之git tag和ReleaseMilestone
以下是关于 Git Tag、Release 和 Milestone 的深度融合内容,并补充了关于 Git Tag 的所有命令、详细解释和指令实例,条理清晰,结合实际使用场景和案例。 1. Git Tag 1.1 定义 • Tag 是 Git 中用于标记特定提交(commit…...
【每日学点HarmonyOS Next知识】Web上传文件、监听上下左右区域连续点击、折叠悬停、字符串相关、播放沙盒视频
1、HarmonyOS APP内h5原生webview input[typefile]无法唤醒手机上传? 文件上传要使用对应的picker https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/web-file-upload-V5 Web组件支持前端页面选择文件上传功能,应用开发者可以使用on…...
解决电脑问题(3)——显示器问题
当电脑显示器出现问题时,可以根据不同的故障现象采取相应的解决方法,以下是一些常见的情况及解决措施: 屏幕无显示 检查连接:首先检查显示器与电脑主机之间的视频连接线是否插好,确保两端的接口都牢固连接,…...
AArch64架构及其编译器
—1.关于AArch64架构 AArch64是ARMv8-A架构的64位执行状态,支持高性能计算和大内存地址空间。它广泛应用于现代处理器,如苹果的A系列芯片、高通的Snapdragon系列,以及服务器和嵌入式设备。 • 编译器:可以使用GCC、Clang等编译器编…...
免费送源码:Java+springboot+MySQL 房屋租赁系统小程序的设计与实现 计算机毕业设计原创定制
目 录 摘要 1 1 绪论 1 1.1选题意义 1 1.2开发现状 1 1.3springboot框架介绍 1 1.4论文结构与章节安排 1 2 房屋租赁系统小程序系统分析 3 2.1 可行性分析 3 2.1.1 技术可行性分析 3 2.1.2 经济可行性分析 3 2.1.3 法律可行性分析 3 2.2 系统功能分析 3 2.2.1 功…...
前端数据模拟 Mock.js 学习笔记
mock.js介绍 Mock.js是一款前端开发中拦截Ajax请求再生成随机数据响应的工具,可以用来模拟服务器响应 优点是:非常方便简单,无侵入性,基本覆盖常用的接口数据类型支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜…...
【Linux内核系列】:深入解析输出以及输入重定向
🔥 本文专栏:Linux 🌸作者主页:努力努力再努力wz ★★★ 本文前置知识: 文件系统以及文件系统调用接口 用c语言简单实现一个shell外壳程序 内容回顾 那么在此前的学习中,我们对于Linux的文件系统已经有了…...
Adam 优化器与动量法:二阶矩与 ODE 的联系
Adam 优化器与动量法:二阶矩与 ODE 的联系 作为深度学习研究者,你一定对 Adam(Adaptive Moment Estimation)优化器非常熟悉。它因自适应学习率和高效率而成为训练神经网络的标配算法。Adam 使用了一阶动量(梯度的指数…...
嵌入式学习第二十三天--网络及TCP
进程通信的方式: 同一主机 传统 system V 不同主机 网络 --- 解决不同主机间 的进程间通信 网络 (通信) //1.物理层面 --- 联通(通路) //卫星 2G 3G 4G 5G 星链 (千帆) //2.逻辑层面 --- 通路(软件) MAC os LINUX …...
前端表单提交与后端处理全解析:从HTML到Axios与SpringBoot实战
前端表单提交与后端处理全解析:从HTML到Axios与SpringBoot实战 一、GET与POST请求的两种面孔 1. HTML表单基础实现 <!-- GET请求示例:搜索表单 --> <form action="/api/search" method="GET"><input type="text" name="…...
python django orm websocket html 实现deepseek持续聊天对话页面
最终效果: 技术栈: python django orm websocket html 项目结构: 这里只展示关键代码: File: consumers.py # -*- coding:utf-8 -*- # Author: 喵酱 # time: 2025 - 03 -02 # File: consumers.py # desc: import json from asg…...
大白话html语义化标签优势与应用场景
大白话html语义化标签优势与应用场景 大白话解释 语义化标签就是那些名字能让人一看就大概知道它是用来做什么的标签。以前我们经常用<div>来做各种布局,但是<div>本身没有什么实际的含义,就像一个没有名字的盒子。而语义化标签就像是有名…...
考研英语语法全攻略:从基础到长难句剖析
引言 在考研英语的备考之旅中,语法犹如一座灯塔,为我们在浩瀚的英语知识海洋中指引方向。无论是阅读理解中复杂长难句的解读,还是写作时准确流畅表达的需求,扎实的语法基础都起着至关重要的作用。本文将结合有道考研语法基础入门课的相关内容,为大家全面梳理考研英语语法…...
Vue3 生命周期
回顾Vue2的生命周期 创建(创建前,创建完毕)beforeCreate、created挂载(挂载前,挂载完毕)beforeMount、mounted更新(更新前,更新完毕)beforeUpdate、updated销毁…...
hbase-05 namespace、数据的确界TTL
要点 掌握HBase的命名空间namespace概念 掌握HBase数据版本确界 掌握HBase数据TTL 1. HBase的namespace 1.1 namespace基本介绍 在HBase中,namespace命名空间指对一组表的逻辑分组,类似RDBMS中的database,方便对表在业务上划分。Apache…...
线程的常见使用方法
Java中的线程并不是真正意义的线程,我们使用的是Thread类来表示线程,而这个类是 JVM 用来管理线程的一个类,也就是说,每个线程都有一个唯一的 Thread对象 与之关联 每一个执行流都需要有一个对象来进行描述,那么一个Thread对象就是用来表述一个线程执行流的,JVM会将这些对象统…...
架构师面试(十一):消息收发
问题 IM 是互联网中非常典型的独立的系统,麻雀虽小但五脏俱全,非常值得深入研究和探讨,继上次IM相关题目之后,我们继续讨论IM相关话题。 关于IM系统【消息收发模型】的相关描述,下面说法错误的有哪几项? …...
MoonSharp 文档一
目录 1.Getting Started 步骤1:在 IDE 中引入 MoonSharp 步骤2:引入命名空间 步骤3:调用脚本 步骤4:运行代码 2.Keeping a Script around 步骤1:复现前教程所有操作 步骤2:改为创建Script对象 步骤…...
【linux网络编程】端口
一、端口(Port)概述 在计算机网络中,端口(Port) 是用来标识不同进程或服务的逻辑通信端点。它类似于一座大楼的房间号,帮助操作系统和网络协议区分不同的应用程序,以便正确地传输数据。 1. 端口…...
Vulnhub-Node
目录标题 一、靶机搭建二、信息收集靶机信息扫ip扫开放端口和版本服务信息指纹探测目录扫描 三、Web渗透信息收集zip爆破ssh连接 四、提权内核版本提权 利用信息收集拿到路径得到账户密码,下载备份文件,base64解密后,利用fcrackzip爆破zip压缩…...
RK3568平台(camera篇)camera3_profiles_rk3588.xml解析
camera3_profiles_rk3588.xml 是一个与 Android 相机 HAL(硬件抽象层)相关的配置文件,通常用于定义 Rockchip RK3588 平台上的相机设备及其功能。该文件基于 Android 的 Camera3 HAL 框架,用于描述相机的配置、流配置、分辨率、帧率、格式等信息。 以下是对 camera3_profi…...
高阶哈希算法
SHA-256简介 SHA-256 是 **SHA-2(Secure Hash Algorithm 2)**家族中的一种哈希算法,由美国国家安全局设计,并于 2001 年发布。它能够将任意长度的数据映射为一个固定长度256 位,即 32 字节的哈希值,通常以…...
Spark数据倾斜深度解析与实战解决方案
Spark数据倾斜深度解析与实战解决方案 一、数据倾斜的本质与影响 数据倾斜是分布式计算中因数据分布不均导致的性能瓶颈现象。当某些Key对应的数据量远超其他Key时,这些"热点Key"所在的Task会消耗80%以上的计算时间,成为整个作业的木桶短板。具体表现为: Task执…...
Kubernetes滚动更新实践
前言 在我之前的项目中,对微服务升级采用的做法是删除整个namespace, 再重新应用所有yaml。 这种方式简单粗暴,但是不可避免的导致服务中断,影响了用户体验 为了解决更新服务导致的服务中断问题, Kubernetes提供了一种…...
Broken pipe
比较常见的一个问题。 但是并不是每个人都能说清楚。 首先注意下写法: Broken pipe # B大写 p小写 主要是grep的时候别写错了 常见的原因 1、客户端关闭连接。 在服务器端处理请求的过程中,客户端突然关闭了连接,例如浏览器关闭、网络断开…...
doris:ClickHouse
Doris JDBC Catalog 支持通过标准 JDBC 接口连接 ClickHouse 数据库。本文档介绍如何配置 ClickHouse 数据库连接。 使用须知 要连接到 ClickHouse 数据库,您需要 ClickHouse 23.x 或更高版本 (低于此版本未经充分测试)。 ClickHouse 数据库的 JDBC 驱动程序&a…...
前K个高频单词
692. 前K个高频单词 - 力扣(LeetCode) 题目描述: 给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序…...
恢复IDEA的Load Maven Changes按钮
写代码的时候不知道点到什么东西了,pom文件上的这个弹窗就是不出来了,重启IDEA,reset windos都没用,网上搜也没收到解决方案 然后开打开其他项目窗口时,看到那个的功能名叫 Hide This Notification 于是跑到Setting里…...
【五.LangChain技术与应用】【31.LangChain ReAct Agent:反应式智能代理的实现】
一、ReAct Agent是啥?为什么说它比「普通AI」聪明? 想象一下,你让ChatGPT查快递物流,它可能直接编个假单号糊弄你。但换成ReAct Agent,它会先推理(Reasoning)需要调用哪个接口,再行动(Action)查询真实数据——这就是ReAct的核心:让AI学会「动脑子」再动手。 举个真…...
Leetcode 62: 不同路径
Leetcode 62: 不同路径 问题描述: 一个机器人位于一个 (m \times n) 网格的左上角(起始点位于 ((0, 0)))。 机器人每次只能向下或向右移动一步。网格的右下角为终点(位于 ((m-1, n-1)))。 计算机器人从左上角到右下角…...
计算机毕业设计SpringBoot+Vue.js火锅店管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Docker Desktop 4.38 安装与配置全流程指南(Windows平台)
一、软件定位与特性 Docker Desktop 是容器化应用开发与部署的一体化工具,支持在本地环境创建、管理和运行Docker容器。4.38版本新增GPU加速支持、WSL 2性能优化和Kubernetes 1.28集群管理功能,适用于微服务开发、CI/CD流水线搭建等场景。 二、安装环境…...
算法系列之广度优先搜索解决妖怪和尚过河问题
在算法学习中,广度优先搜索(BFS)是一种常用的图搜索算法,适用于解决最短路径问题、状态转换问题等。本文将介绍如何利用广度优先搜索解决经典的“妖怪和尚过河问题”。 问题描述 有三个妖怪和三个和尚需要过河。他们只有一条小船…...
【技术白皮书】内功心法 | 第一部分 | IP协议的目的与工作原理(IP地址)
目录 IP协议的介绍IP协议的目的与工作原理IP协议处理过程与信件传递的相似IP协议处理过程与信件传递的区别IP协议中的概念IP数据包IP地址IP地址组成IP地址分类和组成A、B、C三类地址的格式设计特殊类型的IP地址与传统通信地址进行类比IP地址的表示五类IP地址的地址范围IP地址的…...
【Linux】外接硬盘管理
查看外接硬盘信息 连接外接硬盘后,使用以下命令识别设备: lsblk:列出块设备及其挂载点 lsblk示例输出可能显示设备名称如 /dev/sdb。 通过 lsblk -f 可同时显示文件系统类型和 UUID。 fdisk -l:列出所有磁盘的分区信息ÿ…...
【Hadoop】详解Zookeeper选主流程
1. ZooKeeper 的工作原理 Zookeeper 的核心是Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。 为了保证事务的顺序一致性,Zookeeper采用了递增的事务id号(zxid)来标识事务。所有…...
C语言-语法
数据类型 字符串 C中字符串拼接不用+号,直接使用空格。 char* str = "hello" "world"; 换行链接,加上\就不会报错 char* longStr = "00000000000000000000000000000\ 00000000000000000000000000000"; typedef C 语言提供了 typedef …...
Flink Forward Asia 2024 大会 内容整理
一、Flink 2.0:十年磨一剑,开启流计算新纪元 作为 Flink 诞生十周年的重磅更新,Flink 2.0 被定位为“面向未来十年的流计算引擎”,核心目标是解决云原生、AI 融合、存算效率等新时代挑战。以下是它的几大杀手锏: 1. …...
golang进阶知识专项-理解值传递
在 Go 语言中,所有函数的参数传递都是值传递(Pass by Value)。当你将一个变量作为参数传递给函数时,实际上传递的是该变量的副本,而不是变量本身。理解这一点对于避免常见的编程错误至关重要。根据不同的类型ÿ…...
2020年联考《申论》第三题(河北县级卷)
材料: 总面积不过八平方米的店铺,摆满货品之后,两人在店内走动都有些困难,但这家小店在当地却是小有名气的老字号。69岁的店主老林是资深木雕艺人,更被称为“最后的手工酸枝筷子传人”。手工木筷取材自缅甸坤甸木、老挝…...
Kali WebDAV 客户端工具——Cadaver 与 Davtest
1. 工具简介 在 WebDAV 服务器管理和安全测试过程中,Cadaver 和 Davtest 是两款常用的命令行工具。 Cadaver 是一个 Unix/Linux 命令行 WebDAV 客户端,主要用于远程文件管理,支持文件上传、下载、移动、复制、删除等操作。Davtest 则是一款…...
八点八数字科技:开启数字人应用的无限可能
在数字科技飞速发展的时代,八点八数字科技凭借卓越实力,成为行业的领军者。自 2014 年成立,公司汇聚近百位顶尖人才,手握 30 新型发明专利与 80 软件著作权,完成数千万融资,实力备受认可。其自主研发的全…...
Vue 使用 vue-router 时,多级嵌套路由缓存问题处理
Vue 使用 vue-router 时,多级嵌套路由缓存问题处理 对于三级菜单(或多级嵌套路由),vue 都是 通过 keep-alive 组件来实现路由组件的缓存。 有时候三级或者多级路由时,会出现失效情况。以下是三级菜单缓存的例子。 最…...
《实战AI智能体》Deepseek可以做什么?自然语言理解与分析
在人工智能技术快速迭代的今天,Deepseek凭借其先进的自然语言处理能力,正在重塑人机交互的边界。本文将从技术实现维度,深入解析该平台在自然语言理解、知识推理与文本分类三大核心领域的技术突破与应用实践。 一、深度语义理解引擎 Deepseek构建了多层级的语义解析架构,实…...
虚拟主机认证功能
一.认证功能 类型: 1.基于客户端地址的认证 2.基于用户的认证 1.基于客户端地址的认证 nginx是一款模块化软件,功能都是基于模块实现的。 如上图所示,访问认证是使用的这个access_module模块。 这个模块也给我们提供了一些指令…...