顯示具有 程式練習紀錄 標籤的文章。 顯示所有文章
顯示具有 程式練習紀錄 標籤的文章。 顯示所有文章

[PB6.5 ]dw for excel function

 1.創建Excel對象

  eole=CREATEOBJECT(′Excel.application′)

  2.添加新工作簿

  eole.Workbooks.add

  3.設置第3個工作表爲激活工作表

  eole.Worksheets(″sheet3″).Activate

  4.打開指定工作簿

  eole.Workbooks.Open(″c:\temp\ll.xls″)

  5.顯示Excel窗口

  eole.visible=.t.

  6.更改Excel標題欄

  eole.Caption=″VFP應用程序調用Microsoft Excel″

  7.給單元格賦值

  eole.cells(1,4).value=XM(XM爲數據庫字段名)

  8.設置指定列的寬度(單位:字符個數)

  eole.ActiveSheet.Columns(1).ColumnWidth=5

  9.設置指定行的高度(單位:磅)

  eole.ActiveSheet.Rows(1).RowHeight=1/0.035

  (設定行高爲1釐米,1磅=0.035釐米)

  10.在第18行之前插入分頁符

  eole.Worksheets(″Sheet1″).Rows(18).PageBreak=1

  11.在第4列之前刪除分頁符

  eole.ActiveSheet.Columns(4).PageBreak=0

  12.指定邊框線寬度(Borders參數如下)

  ole.ActiveSheet.Range(″b3:d3″).Borders(2).Weight=3

  13.設置四個邊框線條的類型

  eole.ActiveSheet.Range(″b3:d3″).Borders(2).LineStyle=1

  (其中Borders參數:1-左、2-右、3-頂、4-底、5-斜、6-斜/;LineStyle值:1與7-細實、2-細虛、4-點虛、9-雙細實線)

  14.設置頁眉

  eole.ActiveSheet.PageSetup.CenterHeader=″報表1″

  15.設置頁腳

  eole.ActiveSheet.PageSetup.CenterFooter=″第&P頁″

  16.設置頁眉到頂端邊距爲2釐米

  eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035

  17.設置頁腳到底邊距爲3釐米

  eole.ActiveSheet.PageSetup.FooterMargin=3/0.035

  18.設置頂邊距爲2釐米

  eole.ActiveSheet.PageSetup.TopMargin=2/0.035

  19.設置底邊距爲4釐米

  eole.ActiveSheet.PageSetup.BottomMargin=4/0.035

  20.設置左邊距爲2釐米

  veole.ActiveSheet.PageSetup.LeftMargin=2/0.035

  21.設置右邊距爲2釐米

  eole.ActiveSheet.PageSetup.RightMargin=2/0.035

  22.設置頁面水平居中

  eole.ActiveSheet.PageSetup.CenterHorizontally=.t.

  23.設置頁面垂直居中

  eole.ActiveSheet.PageSetup.CenterVertically=.t.

  24.設置頁面紙張大小(1-窄行8 5 11 39-寬行14 11)

  eole.ActiveSheet.PageSetup.PaperSize=1

  25.打印單元格網線

  eole.ActiveSheet.PageSetup.PrintGridlines=.t.

  26.拷貝整個工作表

  eole.ActiveSheet.UsedRange.Copy

  27.拷貝指定區域

  eole.ActiveSheet.Range(″A1:E2″).Copy

  28.粘貼

  eole.WorkSheet(″Sheet2″).Range(″A1″).PasteSpecial

  29.在第2行之前插入一行

  eole.ActiveSheet.Rows(2).Insert

  30.在第2列之前插入一列

  eole.ActiveSheet.Columns(2).Insert

  31.設置字體

  eole.ActiveSheet.Cells(2,1).Font.Name=″黑體″

  32.設置字體大小

  eole.ActiveSheet.Cells(1,1).Font.Size=25

  33.設置字體爲斜體

  eole.ActiveSheet.Cells(1,1).Font.Italic=.t.

  34.設置整列字體爲粗體

  eole.ActiveSheet.Columns(1).Font.Bold=.t.

  35.清除單元格公式

  eole.ActiveSheet.Cells(1,4).ClearContents

  36.打印預覽工作表

  eole.ActiveSheet.PrintPreview

  37.打印輸出工作表

  eole.ActiveSheet.PrintOut

  38.工作表另爲

  eole.ActiveWorkbook.SaveAs(″c:\temp\22.xls″)

  39.放棄存盤

  eole.ActiveWorkbook.saved=.t.

  40.關閉工作簿

  eole.Workbooks.close

  41.退出Excel

  eole.quit

  42 合併

  string worksheet,beginRowcol,EndRowCol

  MyOLE.ActiveWorkBook.Sheets(worksheet).Range(BeginRowCol ":" EndRowCol).Select

  MyOLE.ActiveWorkBook.Sheets(worksheet).Range(BeginRowCol ":" EndRowCol).Merge

  43 sheet改名

  MyOLE.ActiveWorkBook.Sheets(olename).select

  MyOLE.ActiveWorkBook.Sheets(olename).name=newname

  MyOLE=Create OLEObject

  ConnectErr=MyOLE.ConnectToNewObject ("excel.Application")

  MyOLE.visible=false

  //打開指定的XLS文件激活workbooks

  MyOLE.application.workbooks.Open (FilePath)

  //對XLS文件進行了改動以後,在關閉該文件時是否需要向用戶提出警告。

  MyOLE.Application.DisplayAlerts = False

  if isnull(MyOLE) then return -1 ;

  if ConnectErr <0 then

  choose case ConnectErr

  case -1

  messagebox('錯誤提示','無效的調用')

  case -2

  messagebox('錯誤提示','類名沒發現')

  case -3

  messagebox('錯誤提示','對象不能創建')

  case -4

  messagebox('錯誤提示','文件不能連接')

  case -5

  messagebox('錯誤提示','不能連接現在的對象')

  case -6

  messagebox('錯誤提示','文件無效')

  case -7

  messagebox("錯誤提示","文件不存在或已經打開")

  case -8

  messagebox("錯誤提示","服務器不能裝載選擇的文件")

  case -9

  messagebox("錯誤提示","其他錯誤")

  end choose

  return -1

  end if

  ///////////////////////////////////////////////////////////////////////////////

  oleobject xlApp    //聲明Excel應用程序對象

  xlApp = Create OLEObject

  OLEObject xlsub1,xlsub2,xlsub3,obook1,obook2,xlsub4,obook3

  ret = xlApp.ConnectToNewObject( "Excel.Sheet" ) //打開自動化對象 應爲 "excel.application"

  if ret < 0 then

          MessageBox("Connect to Excel Failed !",string(ret))

     return

  //操作第一個excel文件

  string ls_file3="C:\mytest.xls"

  obook3=xlApp.Application.Workbooks.Open(ls_file3) //打開文件

  xlsub4 = xlapp.Application.ActiveWorkbook.Worksheets[1] //激活第一頁

  //對單元格賦值

  xlsub4.cells[c,3].Value = string(mydata.getitemdecimal(r,'rs'))

  xlsub4.cells[c,5].Value = string(mydata.getitemdecimal(r,'yp'))

  xlsub4.cells[c,6] = string(mydata.getitemdecimal(r,'jc'))

  xlsub4.cells[c,7] = string(mydata.getitemdecimal(r,'hy'))

  xlsub4.cells[c,8] = string(mydata.getitemdecimal(r,'zl'))

  //合併一個excel文件

  string ls_ran

  ls_ran = "B6:M"+string(ld_1+1)

  obook1 = xlApp.Application.Workbooks.Open(ls_file2)

  xlsub1 = xlapp.Application.ActiveWorkbook.Worksheets[1]

  xlsub1.Range(ls_ran).Copy()        //把所選內容複製到內存中

  

  xlApp.Application.Visible = false

  xlsub2 = obook3.Worksheets.add()

  xlsub2.name = "分類彙總"   

  xlsub2.Range(ls_ran).PasteSpecial() //把上一個文件內容粘過來

  //加入分類彙總

  obook3.Worksheets("分類彙總").Activate()

  integer a[6]

      a={8,9,10,11,12,13}

      xlsub2.Range(ls_ran).Select()

      xlApp.Application.Selection.Subtotal(3,-4157,a, True, False, True)

  xlsub2.Rows(1).Insert()

  xlsub2.cells[1,1] = left(gs_shuqi,4)+"年"+right(gs_shuqi,2)+"月份"

  xlsub2.Cells[1,1].Font.Name="宋體"

  xlsub2.Cells[1,1].Font.Size=22

  xlsub2.Range("A1:M1").Select()

  xlApp.Application.Selection.Merge()

  xlApp.Application.Selection.HorizontalAlignment = 2

  oBook1.save()

  oBook3.Save()

  oBook3.Saveas(is_docname)

  oBook1.close()

  oBook3.close()

  xlApp.Application.quit()

  xlApp.DisConnectObject()

  

  

  

  本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/chengg0769/archive/2009/05/15/4190560.aspx  

  

官方解答


請問各位高手:

我在Excel中錄製了一段宏。現在我想用powerbuilder調用這個Excel文件,運行這個宏。我應該用什麼命令?用“Run”行嗎?

---------------------------------------------------------------

感謝您使用微軟產品。

Excel 可以作爲OlE sesrver, 所以可被任何支持OLE對象的編程語言調用。下面是一個引用自以第三方網站的例子, 僅供您作參考。

http://www.sybase.com.cn/cn/content/support/exp_jszc_pb_ole_00002.htm

long numcols , numrows , c, r

OLEObject xlapp , xlsub

int ret

// Set the # of columns and rows to process

// Currently Set to copy the entire DW

numcols = long(dw_1.Object.DataWindow.Column.Count)

numrows = dw_1.RowCount()

// Create the oleobject variable xlapp

xlApp = Create OLEObject

// Connect to Excel and check the return code

ret = xlApp.ConnectToNewObject( "Excel.Sheet" )

if ret < 0 then

MessageBox("Connect to Excel Failed !",string(ret))

return

end if

// Open a particular Excel file

xlApp.Application.Workbooks.Open("c:\file1.xls") //,false,true

// Make Excel visible

xlApp.Application.Visible = true

// Resolve the Excel reference once

// This technique shortens the script and improves performance

xlsub = xlapp.Application.ActiveWorkbook.Worksheets[1]

// Loop thru the Datawindow and Excel sheet

// The for/next loop copies all rows for each column

For c = 1 to numcols

For r = 1 to numrows

xlsub.cells[r,c] = dw_1.object.data[r,c]

Next

Next

// Save opened file

//xlApp.Application.Activeworkbook.Save()

// SaveAs a different filename

//xlApp.Application.Activeworkbook.SaveAs("c:\file2.xls")

// clean up

在Excel 中,application 對象下有Run 命令,我們只需調用Run 來執行我們的宏。這是一個VB的例子。

HOWTO: Create and Call an Excel Macro Programmatically from VB[OffDev]

ID: Q194611

http://support.microsoft.com/default.aspx?scid=kb;ZH-CN;q194611

在powerbuilder中是類似的.

希望這些訊息對您有幫助。

-                  微軟全球技術中心 DTA技術支持


基本語句

Ole_object.Workbooks.add//新建一個Excel文件

Ole_object.Workbooks.Open( "FileName ")//打開一個已存在Excel文件

Ole_object.ActiveWorkBook.Sheets( "SheetName ").Select//選擇文件中一個工作表

Ole_object.Application.Run( "MacroName ")//運行宏

Ole_object.Application.Visible=TRUE//Excel文件可見

Ole_object.Application.ScreenUpdating=true//設置可見屬性

②格式設置

Ole_object.ActiveSheet.Columns( "A:U ").AutoFit//列寬自動調整

Ole_object.ActiveSheet.Columns( "A:Z ").ColumnWidth=6.75//列寬


 


Ole_object.ActiveSheet.Rows( "1:100 ").RowHeight=12//行高


 


Ole_object.Application.StandardFont= "ArialNarrow ";//設置字體

Ole_object.Application.StandardFontSize= "8 "//設置字號

Ole_object.ActiveSheet.Font.Size= "8 "//設置字號

Ole_object.ActiveSheet.Font.Bold=True//粗體

Ole_object.ActiveSheet.Font.Italic=True//斜體

Ole_object.ActiveSheet.Font.Underline=True//下劃線

Ole_object.ActiveSheet.Font.StrikeThrough=True//刪除線

Ole_object.ActiveSheet.HorizontalAlignment=3//水平:4靠右;3居中;2靠左

Ole_object.ActiveSheet.VerticalAlignment=2//垂直:3靠下;2居中;1靠上

Ole_object.ActiveSheet.cells(2,1).font.name=’黑體’//設置字體

Ole_object.ActiveSheet.cells(2,1).font.size=25//設置字體大小

③工作區域操作:

Ole_object.ActiveSheet.Range( "A1:Z10 ").Property=value//設置一個工作區域內的屬性值

Ole_object.ActiveSheet.Range( "A1:Z10 ").Merge//合併單元格

Ole_object.ActiveSheet.Range( "A1:Z10 ").WrapText=False//自動換行禁止

Ole_object.ActiveSheet.Range( "A1:Z10 ").Borders(b_type).Weight=i_val//b_type:1左邊界;2右邊界;3上邊界;4下邊界;5左上傾斜;6


 


右上傾斜(以上爲對單元格的操作)7左邊界;8上邊界;9下邊界;10右邊界;11內部垂直邊界;12內部水平邊界(以上爲對區域的操

作)//i_val:0無邊界線;然後1,2,3。。。依次邊界線加粗

Ole_object.ActiveSheet.Range( "A1:Z10 ").Borders(b_type).linestyle=1//1與7—細實、2—細虛、4—點虛、9—雙細實線

④賦值操作

Ole_object.ActiveSheet.range( "A1:Z10 ").Cells.value=“姓名”

Ole_object.ActiveSheet.range( "A1:Z10 ").Cells.value=1

Ole_object.ActiveSheet.range( "A1:Z10 ").Cells.value=“2003-01-01”

Ole_object.ActiveSheet.Range( "A1:Z10 ").Cells(1,2).value=“年齡”//區域內一個單元格的賦值

Ole_object.ActiveSheet.Range( "A1:Z1 ").Cells(1,1).value=“SUM(RC[-9]:RC[-1])”

ls_filename = "C:\alt_report\wf_alt_report.xls "

if FileExists(ls_filename) then FileDelete(ls_filename)

OleObject Loo_Excel

Loo_Excel=create oleobject

if Loo_Excel.ConnectToNewObject( "Excel.Application ") <> 0 then

messagebox( '提示 ', '系統未安裝Excel,無法運行此操作! ')

return

end if

Loo_Excel.Application.Workbooks.Add()

Loo_Excel.Application.Workbooks(1).worksheets(1)

Loo_Excel.Application.Visible = True

Loo_Excel.Application.ScreenUpdating = false

// '正在處理表頭...... '

Loo_Excel.Range( "A1:AB1 ").Select

Loo_Excel.Selection.MergeCells = True

Loo_Excel.Selection.HorizontalAlignment = 3

Loo_Excel.Selection.VerticalAlignment = 3

Loo_Excel.Selection.Font.Bold = True

Loo_Excel.Selection.Font.Size = 14

Loo_Excel.Selection.RowHeight = 28.50

Loo_Excel.ActiveCell.FormulaR1C1 = dw_3.describe( "ls_title "+ ".text ")

///寫標頭

Loo_Excel.application.workbooks(1).worksheets(1).cells(3, 1 ).value = "排單號碼 "

// dw_2.describe( "po_no "+ ".name "+ "_t.text ")

Loo_Excel.application.workbooks(1).worksheets(1).cells(3, 2 ).value = "客人款號 "

Loo_Excel.application.workbooks(1).worksheets(1).cells(3, 3 ).value = dw_2.describe( "cust_nam_t.text ")

///內容

for i=1 to dw_2.rowcount()

Loo_Excel.application.workbooks(1).worksheets(1).cells(3+i, 1).value = string( dw_2.object.po_no[i] )

next

Loo_Excel.application.ActiveWorkbook.SaveAs(ls_filename)

Loo_Excel.Application.ScreenUpdating = True

Loo_Excel.DisconnectObject()

-----------------------------------------------------------------

也可以從Excel提取信息,假設你想知道當前活動Sheet的A1單元(Cell)的值,

你可以使用如下代碼:

ANY MyValue

MyValue = ExcelServer.ActiveSheet.Cells(1,1).value

CHOOSE CASE ClassName(MyValue)

CASE 'string '

//assign to string

//other data types here

......

END CASE

注意ANY變量的用法。返回的Excel對象的method/property可能是各種各樣的數據

類型,所以除非你絕對確定返回類型(例如一個Cell對象的ColumnWidth屬性一般都

返回的是integer變量),你一般都要使用ANY變量,然後再用ClassName函數來確定

對應的值。



 

範例代碼

  POWERBUILDER是面向對象的數據庫開發工具之一,它可以操縱衆多大型數據庫和桌面數據庫,支持多種硬件平臺。但它有一個致命的弱點,就是打印報表非常不方便,打印函數太少,特別是對中國式報表。而 EXCEL製表卻非常容易,若把兩者結合起來使用則會取長補短。 本人通過實踐,順利地把兩者結合起來。首先用 POWERBUILDER製作一窗口w_excel,然後在窗口中建立一個數據窗口dw_excel和三個按鈕cb_saveas、cb_start、cb_print。同時編寫腳本爲:

  1.cb_saveas的腳本爲:

  saveas(w_excel.dw_excel, ″c:\jycf\xmk.xls″, excel!, true)

  2.cb_start的腳本爲:

  run(″c:\program files\microsoft office\office\excel.exe xmk.xls″,maximized!)

  3.cb_print的腳本爲:

  long handle_1

  handle_1=openchannel(″excel″,″xmk.xls″) ′建立與EXCEL的通道

  setremote(″r2c1″,″序號″,″excel″,″ xmk.xls″)

  setremote(″r2c2″,″摘要″,″excel″,″ xmk.xls″)

  setremote(″r2c3″,″收入″,″excel″,″ xmk.xls″)

  setremote(″r2c4″,″支出″,″excel″,″ xmk.xls″)

  setremote(″r2c5″,″餘額″,″excel″,″ xmk.xls″)

  setremote(″r2c6″,″日期″,″excel″,″ xmk.xls″)

  //更改某一行或某一列的值,同時關閉通道

  closechannel(handle_1,handle(w_excel))

  string str_print

  str_print=″[print()]″

  execremote(str_print,″excel″,″xmk.xls)

  這樣一來,就把兩者有機地結合起來。

  論文專題   



 

  摘要Microsoft公司的Office辦公軟件中的Excel是一種專業的電子表格處理軟件,Microsoft公司對它的Office軟件系列都提供了對自動化技術的支持,這樣就可以通過其他高級編程語言調用Office軟件系列,利用其成熟而可靠的技術與功能來輕鬆實現特定功能。本文中,將通過自動化技術,實現在PowerBuilder中調用Excel來實現表格的輸出與打印。

  關鍵詞   自動化 Excel PowerBuilder 表格

  1 問題的提出

  在爲某企業設計電子圖文檔管理系統中,用戶提出要求,要能夠快速輸出某些電子表格。在未使用自動化技術之前,該企業使用的是AutoCad軟件來一次性將多個表格生成到一個DWG文件中,然後通過繪圖儀出圖。這種做法的好處在於能夠有效的節省企業的開支,一次性生成大量的表格。但是,缺點也是明顯的:這種做法欠缺靈活性,當遇到只需要輸出少量表格的情況時,做法過於複雜。即這種做法非常適合於大量表格的批量輸出,而不適合個別表格的單獨輸出。正是在這種背景下,我們提出了使用Excel電子表格處理軟件來處理該企業的表格輸出問題。

  Excel軟件是專門爲處理各式電子表格而設計,它能夠非常高效而專業的處理各式表格,並且非常關鍵的是:它具有表格計算彙總功能,在這一點上,AutoCad軟件是無法相比的。另外一個原因,在當前的企業中,打印機的使用日益普及,打印速度也日益加快,當多個用戶同時需要打印時,可以通過高速的網絡打印機來輕鬆實現,在這一點上,使用Excel也具有一定的優勢。

  2 自動化技術

  Microsoft公司提供的自動化技術,簡單的說,就是將某一個應用程序的功能(可能是一部分)當作一系列的對象來向其他的外部應用程序暴露(Expose),這個外部應用程序就可以使用這些對象,這個過程就被稱爲自動化(Automation)。例如,Excel,我們可以將它的大部分功能當作一系列對象來加以暴露,然後在另外的應用程序中使用這些對象,這就是使用自動化對象來調用Excel完成指定功能的關鍵所在。

  一個應用程序的可訪問對象被稱爲對象模型(Object Model),如果能夠使用自動化來操縱一個程序的對象模型就意味着可以重複使用組件。例如,使用自動化,利用Excel中已經編寫和測試好的代碼來進行復雜的數學運算,這就省去了程序員親自動手編寫和調試複雜代碼的麻煩。

  暴露對象的程序被稱爲服務器(Servers),使用這些對象的程序被稱爲客戶(Clients)。在這裏,我們把Excel當作自動化服務器,把我們的PowerBuilder應用程序當作客戶,這樣就可以通過自動化技術來實現特定的表格生成和打印功能。

  在大多數的Office軟件中都包含一個Application對象,Excel也不例外,這個對象是Excel對象模式中的基礎對象,它包含了許許多多的成員(Member),但是在這裏,我們只需要使用到其中的一部分。

  3 在PowerBuilder中使用自動化技術

  PowerBuider是Sybase公司推出的一種高級數據庫應用程序開發環境,在這個環境中開發數據庫應用程序,使用其專利技術——DataWindow,可以很輕鬆的開發出非常專業的數據庫應用程序。此外,PowerBuilder還支持多種數據庫,能夠很輕鬆的與目前流行的MS SQL Server、Oracle等企業級數據庫建立連接,處理各種事務。

  PowerBuilder中的編程語言被稱爲腳本(Script),實際上,使用PowerBuilder編寫的程序也是事件驅動,在界面設計上也完全做到了“所見即所得”,並完全使用面向對象的編程思想,它還提供了對OLE、DDE、Automation等技術的支持,下面就來說明如何在PowerBuilder中使用自動化技術。

  首先,聲明一個OLE對象,如下:

  OLEObject OLE_MyExcel

  其次,創建該OLE對象,如下:

  OLE_MyExcel =Create OLEObject

  然後,使用PowerBuilder中的ConnectToNewObject函數來創建一個新的OLE對象,並且連接到該對象上,如下:

  OLE_MyExcel. ConnectToNewObject ("excel.Application")

  調用該函數時,如果成功的話,返回值是0,否則就意味着調用失敗。

  到此,自動化的準備工作已經完成,下面是具體的操作過程。

  4 處理和打印表格

  在調用Excel時,首先需要解決的一個問題是是否讓Excel可見,即是否爲後臺操作。這個問題可以簡單的通過設置Visible屬性加以控制,如果希望Excel後臺運行,可以簡單的編寫如下語句:

  OLE_MyExcel.visible=false

  然後是打開指定的XLS文件,具體的語句如下:

  OLE_MyExcel.Application.Workbooks.Open ("d:\excel-example.xls")

  要操縱數據列表中的數據單元,就必須對ActiveCell對象進行操縱,該對象是Application對象中一項屬性。將數據輸入到一個數據單元包括兩個步驟:第一是選擇一個數據單元,第二是將數據傳遞給它。選擇一個數據單元通過調用Range對象的Select()方法就可以完成,Range對象是用來選擇一個或多個數據單元的。Select()方法需要起始的行數、列數和結束的行數、列數來確定所選擇的數據單元。如果只選擇一個單獨的數據單元,就可以忽略結束的行、列數。當範圍被設定以後,將數據傳遞給ActiveCell對象(引用了被Range對象指定的數據單元)的FormulaR1C1屬性。如下:

  OLE_MyExcel.Range("c10").Select()

  OLE_MyExcel.ActiveCell.FormulaR1C1 = sle_2.text //Sle_2爲一個靜態文本框控件

  OLE_MyExcel.Range("J10").Select()

  ……

  如果希望得到一系列數值的和,則需要首先使用Select()方法來指定需要求和的Cell的範圍,然後指定存放和的Cell位置,最後調用SUM方法即可,如下:

  OLE_MyExcel.Range(“A1:D1”).Select()

  OLE_MyExcel.Range(“E1”).Activate()

  OLE_MyExcel.ActiveCell.FormulaR1C1 = “=SUM(RC[-4]:RC[-1])”

  當然還可以進行其他方面的設置,例如把字體設置爲粗體(Bold),則可以編寫如下代碼:

  OLE_MyExcel.Range(“A1:E1”).Select()

  OLE_MyExcel.Selection.Font.Bold = True

  至於其他的設置可以參考相關書籍。

  至於表格的打印,則是簡單的調用PrintOut()方法即可,但是需要首先指定打印的範圍,如下是打印名爲“Sheet1”的WorkSheet的代碼:

  OLE_MyExcel.Worksheets("sheet1").Activate()

  OLE_MyExcel.ActiveSheet.PrintOut()

  接下來是關於對XLS文件進行了改動以後,在關閉該文件時是否需要向用戶提出警告。這個問題只需要簡單的對OLE_MyExcel.Application.DisplayAlerts屬性進行設置即可,爲True時彈出警告框,爲False時不彈出警告框,保存所作的修改。

  最後一步,在作完所有工作以後,需要關閉自動化對象,撤銷與自動化服務器的連接,銷燬OLE對象,因爲使用自動化程序,尤其是Word或Excel這樣的Office程序,所消耗的系統資源是很龐大的,因此在每次工作完成之後,需要釋放這部分系統資源。如下:

  OLE_MyExcel.Application.quit()

  OLE_MyExcel.DisConnectObject()

  destroy OLE_MyExcel

  5 結束語

  在使用了自動化技術以後,完滿的解決了原來的表格處理問題,可以非常方便的對各種表格進行小批量的處理與打印,非常靈活。如果能夠與企業的數據庫結合起來,通過外部程序將數據成批輸入,亦可解決大批量數據輸出的問題,不失爲一條好的解決方案。

  在實際應用中,通過與企業數據庫相結合,使用此方法自動填寫了包含了大量數據的XLS文件,並可以通過打印機打印出來.

         eapp.visible:=false;  

          eworkbook:=eapp.workbooks.add;  

          eworkbook.worksheets[1].name:='java';  

          eworkbook.worksheets[1].Columns[1].ColumnWidth   :=   40;  

          //exworksheet.columns.autofit;//使各列自動對齊  

          eapp.activeworkbook.saveas('c:\222.xls');  

          eapp.workbooks.close;  

          eapp.quit;


eworkbook.worksheets[1].columns.autofit


ExcelWorksheet.columns.autofit

[PB]暫存 Code 參考

window_function 取得row資訊後做迴圈運算

long   ll_count

string  ls_seq_no, ls_out, ls_part, ls_partnum, ls_card, ls_postal, ls_addr1, ls_addr2, ls_addr3

decimal ld_out, ld_turn


tab_1.tabpage_1.dw_4.Reset()//重新產生dw4之前先清除


long ll_dw3_count,ll_dw3_rowcount,ll_dw3_row

string ls_dw3_out,ls_dw3_part,ls_dw3_pick

ll_dw3_rowcount  = tab_1.tabpage_1.dw_3.rowcount()


ls_seq_no = '000'

ll_count = 0


declare curd_lsf200 cursor for 

  select a.part_no, a.part_num, a.card_no, a.out_no, a.postal, a.addr1, a.addr2, a.addr3

from lsf200 a

where 1 = 1

  and a.proj_no = :fs_proj

  and isnull(a.lsp170_yn,'N') <> 'Y'

order by a.part_no, a.out_no, a.card_no;


open  curd_lsf200;

fetch curd_lsf200 into :ls_part, :ls_partnum, :ls_card, :ls_out, :ls_postal, :ls_addr1, :ls_addr2, :ls_addr3 ;

do while sqlca.sqlcode = 0

ll_dw3_count = 1

do while ll_dw3_count <= ll_dw3_rowcount

ll_dw3_row = tab_1.tabpage_1.dw_3.GetRowFromRowId(ll_dw3_count)

ls_dw3_out = tab_1.tabpage_1.dw_3.getitemstring(ll_dw3_row,"out_no")

ls_dw3_part = tab_1.tabpage_1.dw_3.getitemstring(ll_dw3_row,"part_no")

ls_dw3_pick = tab_1.tabpage_1.dw_3.getitemstring(ll_dw3_row,"ls_pick")

if ls_dw3_pick = 'Y' and ls_dw3_out = ls_out and  ls_dw3_part = ls_part then

ll_count = ll_count + 1

ls_seq_no  = string( long(ls_seq_no) + 1 ,'000')

tab_1.tabpage_1.dw_4.insertrow(0)

tab_1.tabpage_1.dw_4.setitem(ll_count, "seq_no", ls_seq_no)

tab_1.tabpage_1.dw_4.setitem(ll_count, "part_no", ls_part)

tab_1.tabpage_1.dw_4.setitem(ll_count, "part_num", ls_partnum)

tab_1.tabpage_1.dw_4.setitem(ll_count, "card_no", ls_card)

tab_1.tabpage_1.dw_4.setitem(ll_count, "out_no", ls_out)

tab_1.tabpage_1.dw_4.setitem(ll_count, "postal", ls_postal)

tab_1.tabpage_1.dw_4.setitem(ll_count, "addr1", ls_addr1)

tab_1.tabpage_1.dw_4.setitem(ll_count, "addr2", ls_addr2)

tab_1.tabpage_1.dw_4.setitem(ll_count, "addr3", ls_addr3)

tab_1.tabpage_1.dw_4.setitem(ll_count, "ls_pick", 'Y')

end if

ll_dw3_count = ll_dw3_count+1

loop

fetch curd_lsf200 into :ls_part, :ls_partnum, :ls_card, :ls_out, :ls_postal, :ls_addr1, :ls_addr2, :ls_addr3 ;

loop 

close curd_lsf200;


return


buttenchecked

//IFITB00F-HD000000000860 新增條件:分公司別和部門別//業務員

//分公司

if dwo.name = "pb_comp" then

lstr.pc_cnt = 2

openwithparm( w_pick_company, lstr, gw_win )

lstr = Message.PowerObjectParm

if lstr.pc_cnt > 0 then

ls_code1 = lstr.ps_code1[1] 

tab_1.tabpage_1.dw_1.setitem( row, "comp_no",  ls_code1)

tab_1.tabpage_1.dw_1.setitem( row, "comp_name_a",   lstr.ps_code2[1]  )

tab_1.tabpage_1.dw_1.setcolumn("comp_no")

   else

tab_1.tabpage_1.dw_1.setfocus()

tab_1.tabpage_1.dw_1.setcolumn("comp_no")

   end if

tab_1.tabpage_1.dw_1.setfocus()

tab_1.tabpage_1.dw_1.setcolumn("comp_no")

goto buttonclicked_exit

end if


//部門別

if dwo.name = "pb_dept" then

lstr.pc_cnt = 2

openwithparm( w_pick_dept, lstr, gw_win )

lstr = Message.PowerObjectParm

// 有挑選資料

if lstr.pc_cnt > 0 then

ls_code1 = lstr.ps_code1[1]

tab_1.tabpage_1.dw_1.setitem(row, "dept_no", ls_code1)

   tab_1.tabpage_1.dw_1.setitem(row, "dept_name", lstr.ps_code2[1])

tab_1.tabpage_1.dw_1.setcolumn("dept_no")

else

tab_1.tabpage_1.dw_1.setfocus()

tab_1.tabpage_1.dw_1.setcolumn("dept_no")

   end if

tab_1.tabpage_1.dw_1.setfocus()

tab_1.tabpage_1.dw_1.setcolumn("dept_no")

goto buttonclicked_exit

end if

//業務員

IF dwo.name = "pb_emp" THEN  

lstr.pc_cnt = 1

lstr.ps_where="isnull(baf004.emp_yn,'N') = 'Y' and isnull(baf004.leave_date,'') = ''"

openwithparm( w_pick_emp, lstr, gw_win )

lstr = Message.PowerObjectParm

     IF lstr.pc_cnt > 0 THEN 

is_change = "Y"

   tab_1.tabpage_1.dw_1.setitem( row, "emp_id"   ,   lstr.ps_code1[1])

      tab_1.tabpage_1.dw_1.setitem( row, "emp_cname"  , lstr.ps_code2[1])

//    tab_1.tabpage_1.dw_1.setitem( row, "comp_no"  ,   lstr.ps_code3[1])

// tab_1.tabpage_1.dw_1.setitem( row, "comp_name_a", lstr.ps_code4[1])

//

//      tab_1.tabpage_1.dw_1.setitem( row, "dept_no"  ,   lstr.ps_code5[1])  

// tab_1.tabpage_1.dw_1.setitem( row, "dept_name",   lstr.ps_code6[1]) 

//debug

//err_msg(63,2,'@1'+lstr.ps_code1[1]+'AAA'+lstr.ps_code2[1]+'AAA'+lstr.ps_code3[1]+'AAA'+lstr.ps_code4[1]+'AAA'+lstr.ps_code5[1]+'AAA'+lstr.ps_code6[1]+'AAA'+lstr.ps_code7[1]+'AAA'+'@')

//is_err = 'Y'

  ELSE 

tab_1.tabpage_1.dw_1.setfocus()

tab_1.tabpage_1.dw_1.setcolumn("emp_no")

goto buttonclicked_exit

   END if

//tab_1.tabpage_1.dw_1.setcolumn("eng_emp")

//tab_1.tabpage_1.dw_1.setfocus()

goto buttonclicked_exit

END if

itemchange

//IFITB00F-HD000000000860 新增條件:分公司別和部門別//業務員

//分公司

case "comp_no"

//ls_compno ,ls_compnm 

ls_compno = tab_1.tabpage_1.dw_1.getitemstring(row,"comp_no")

select comp_name_a into :ls_compnm from pu_company where comp_no = :ls_compno     

using sqlca;

if ls_compnm <> ''

tab_1.tabpage_1.dw_1.setitem( row, "comp_name_a", ls_compnm  )

tab_1.tabpage_1.dw_1.setcolumn("comp_no")

   else

err_msg(2,2,"@@1" + "此~公~司~代~號~不~存~在~﹐請~重~新~輸~入~﹗ " + "@")

tab_1.tabpage_1.dw_1.setitem( row, "comp_no", ""  )

goto itemchanged_exit

   end if



//部門別 ls_deptno, ls_deptnm

case "dept_no"

   ls_deptno = tab_1.tabpage_1.dw_1.getitemstring(row,"dept_no")

select dept_name into :ls_deptnm  from baf002 where dept_no = :ls_deptno  ;

//select comp_name_a into :ls_compnm from pu_company where comp_no = :ls_compno     

using sqlca;

if ls_compnm <> ''

tab_1.tabpage_1.dw_1.setitem( row, "dept_name", ls_deptnm  )

   else

err_msg(2,2,"@@1" + "此~部~門~代~號~不~存~在~﹐請~重~新~輸~入~﹗ " + "@")

tab_1.tabpage_1.dw_1.setitem( row, "dept_no", ""  )

goto itemchanged_exit

   end if


//業務員

// ls_empid, ls_empnm

case "emp_id"

ls_empid = tab_1.tabpage_1.dw_1.getitemstring(row,"emp_id")

select emp_cname into :ls_empnm from baf004 

where emp_id = :ls_empid 

and isnull(baf004.emp_yn,'N') = 'Y' 

and isnull(baf004.leave_date,'') ='';

using sqlca;

if ls_compnm <> ''

tab_1.tabpage_1.dw_1.setitem( row, "emp_cname", ls_empnm  )

   else

err_msg(2,2,"@@1" + "此~員~工~代~號~不~存~在~﹐請~重~新~輸~入~﹗ " + "@")

tab_1.tabpage_1.dw_1.setitem( row, "dept_no", ""  )

goto itemchanged_exit

   end if

[SQL][SSIS]List for SQL Server SSIS project and packages name

 SELECT 

b.[name] as [專案名稱]

,a.[name] as [dtsx名稱]

FROM SSISDB.catalog.packages as a

left join SSISDB.catalog.projects as b on a.project_id = b.project_id

order by b.[name] asc  ,a.[name] asc

[PB]練習語法(不斷更新)

20221013    li_control = 1 非常重要,可直接選點選該行

//當kind = 1 (LC)必須在phf170s有資料 =0筆 清空欄位並錯誤訊息  

//當kind = 2 (TT)必須在phf170s沒有資料 < 1筆 否則清空欄位並錯誤訊息  

long  ll_row2 

string ls_order_no2 , ls_seq_no2

int ll_cnt

ll_row2 = tab_1.tabpage_1.dw_1s.getrow()

ls_order_no2    = tab_1.tabpage_1.dw_1s.getitemstring(ll_row2,"order_no")

select count(*) into :ll_cnt 

from phf170s

where phf170s.order_no = :ls_order_no2

using sqlca;

if ls_kind = '1' and ll_cnt=0 then

err_msg(2,2,"@@1"+"此~訂~購~單~不~為~類~別~LC"+"@")

li_control = 1

tab_1.tabpage_1.dw_1s.setcolumn("order_no")

tab_1.tabpage_1.dw_1s.setitem(row, "order_no", '')

goto itemchanged_exit

elseif ls_kind = '2' and ll_cnt>0 then

err_msg(2,2,"@@1"+"此~訂~購~單~不~為~類~別~TT"+"@")

li_control = 1

tab_1.tabpage_1.dw_1s.setcolumn("order_no")

tab_1.tabpage_1.dw_1s.setitem(row, "order_no", '')

goto itemchanged_exit

end if



20220905 要另外解開不然所有按鈕不能按

20220901 選取全部column迴圈設定(會排除按鈕butten)                

ll_col = long(tab_1.tabpage_1.dw_1.describe("datawindow.column.count"))


for ll_i = 1 to ll_col

tab_1.tabpage_1.dw_1.SetTabOrder(ll_i, 0)

next



20220830 在pb中insert  

insert into trf100_mail_20220830 ( send_no, keyin_emp,     crt_time,  crt_user ) 

  values ( :ls_send_no, :ls_keyin_emp, getdate(), :ls_loginuid)

commit using sqlca;  //不用等到全部程式完成,直接insert


20220111

取得dw row   while loop 讀出(計算或寫入DB)

long ll_dw3_count,ll_dw3_rowcount,ll_dw3_row

ll_dw3_rowcount  = tab_1.tabpage_1.dw_3.rowcount()

ll_dw3_count = 1

do while ll_dw3_count <= ll_dw3_rowcount

ll_dw3_row = tab_1.tabpage_1.dw_3.GetRowFromRowId(ll_dw3_count)

ls_dw3_out = tab_1.tabpage_1.dw_3.getitemstring(ll_dw3_row,"out_no")

ls_dw3_part = tab_1.tabpage_1.dw_3.getitemstring(ll_dw3_row,"part_no")

ls_dw3_pick = tab_1.tabpage_1.dw_3.getitemstring(ll_dw3_row,"ls_pick")

ll_dw3_count = ll_dw3_count+1

loop



20220111

產生亂數 Rand ( n )   EX:1~32767


20211228  提示訊息選是或否才執行

//確認刪掉的有符合資產檔累計折舊=0才有以刪除

li_rtn = wf_check_del(ls_proj,ls_auto_nos,ls_auto_noe,ls_auto_dates,ls_auto_datee)

if li_rtn > 0 then //回傳0以上表示累計折舊大於零的筆數

err_msg(2,2,"@@1"+"累計折舊大於零無法刪除!"+"@")

//tab_1.tabpage_1.dw_1.setcolumn("out_date")

goto buttonclicked_exit

else

ls_rtn2 = wf_del_count(ls_proj,ls_auto_nos,ls_auto_noe,ls_auto_dates,ls_auto_datee)

if MessageBox('提示信息','確定刪除所選資料共'+ls_rtn2+'筆',Question! ,YesNo! , 1 ) = 1 then

wf_del(ls_proj,ls_auto_nos,ls_auto_noe,ls_auto_dates,ls_auto_datee)

MessageBox('提示信息', '資料已刪除共'+ls_rtn2+'筆')

else

MessageBox('提示信息','放棄刪除')

end if

end if



20211201

//messagebox轉型數字=>文字

messagebox("percent", string(value)+"%")


20211117 

find_text  請注意  powerbuilder6.5 不支援中文查找


20211116 

tab_1.tabpage_1.dw_1.settaborder("cust_no",  0) 

//將taborder設定為0 => 不能點選object , 設為大於0可以點選

tab_1.tabpage_1.dw_1.modify( " cust_no.background.color =  '" + gs_ucolor +  "'" )

//改變背景顏色



[NOPI][C#]Import EXCEL to C# datatable(from xls or xlsx)

need ddl 

npoi vision 2.1.3.1


aspx   


<td colspan="3">     

                  <telerik:RadAsyncUpload ID="Q_btnEXCELChk" runat="server" MaxFileInputsCount="1" Localization-Remove="移除"

                    Localization-Select="瀏覽" ><%--Style="padding: 8px 0px 0px 0px !important; width: 220px!important; font-family: Microsoft JhengHei;"--%>

                </telerik:RadAsyncUpload>

                   

                </td>

                <td colspan="3">

                       <asp:Label ID="Label2" runat="server" Text="" Width="20%"></asp:Label>

                    <asp:Button ID="Q_btnEXCEL" runat="server" Text="匯入預算" OnClick="Q_btnEXCEL_Click"/>

                </td>



--------------------------------------------

 aspx.cs

using NPOI.HSSF.UserModel;

using NPOI.XSSF.UserModel;

using ICSharpCode.SharpZipLib.Zip;

       

protected void Q_btnEXCEL_Click(object sender, EventArgs e)

    {

        string MSG = string.Empty;

        UploadedFile file = Q_btnEXCELChk.UploadedFiles[0];

        //string FileNm = DateTime.Now.ToString("yyyyMMddhhmmss_") + this.USER.EMPNO + ".xls";

        //string fileth = "~/Apps/HDGBJ/Upload" + FileNm;

        //Q_btnEXCELChk.UploadedFiles[0].SaveAs(Server.MapPath(fileth));

        DataTable dtImport = new DataTable();


        if (file.GetExtension() == ".xls")

        {

            HSSFWorkbook workbook_I = new HSSFWorkbook(file.InputStream);

            HSSFSheet sheet_I = (HSSFSheet)workbook_I.GetSheetAt(0);


            if (sheet_I != null)

            {

                int DataRowFrom = 1;

                int DataColFrom = 0;

                int HeaderRowCount = 1;

                int RowCount = sheet_I.PhysicalNumberOfRows;

                //* 實際匯入資料筆數

                int DataRowCount = RowCount - HeaderRowCount;

                //* 表頭資料列的欄位總數 

                int DataColCount = sheet_I.GetRow(0).PhysicalNumberOfCells;


                #region 欄位


                dtImport.Columns.Add("SEG", typeof(string));

                dtImport.Columns.Add("CCID", typeof(string));

                dtImport.Columns.Add("ACCIDNM", typeof(string));

                dtImport.Columns.Add("M1", typeof(string));

                dtImport.Columns.Add("M2", typeof(string));

                dtImport.Columns.Add("M3", typeof(string));

                dtImport.Columns.Add("M4", typeof(string));

                dtImport.Columns.Add("M5", typeof(string));

                dtImport.Columns.Add("M6", typeof(string));

                dtImport.Columns.Add("M7", typeof(string));

                dtImport.Columns.Add("M8", typeof(string));

                dtImport.Columns.Add("M9", typeof(string));

                dtImport.Columns.Add("M10", typeof(string));

                dtImport.Columns.Add("M11", typeof(string));

                dtImport.Columns.Add("M12", typeof(string));

                //dtImport.Columns.Add("ITEMS", typeof(Int32));           

                //dtImport.Columns.Add("TRANSFEE", typeof(decimal));      

                #endregion


                #region 塞值--先塞入datatable在做處理

                for (int i = 1; DataRowCount > i; i++)  //列計數

                {


                    DataRow drImport = dtImport.NewRow();


                    for (int j = 0; 15 > j; j++)  //資料欄位計數

                    {

                        drImport[j] = sheet_I.GetRow(i).GetCell(j);


                        //drImport.Table.Rows[i-1][j]= sheet_I.GetRow(i).GetCell(j);

                        //dtImport.Rows[i-1][j] = 

                    }

                    dtImport.Rows.Add(drImport);

                }



                #endregion


            }

        }

        else if (file.GetExtension() == ".xlsx")

        {

            ///建立Excel 2007檔案

            XSSFWorkbook workbook_I = new XSSFWorkbook(file.InputStream);

            XSSFSheet sheet_I = (XSSFSheet)workbook_I.GetSheetAt(0);


            if (sheet_I != null)

            {

                int DataRowFrom = 1;

                int DataColFrom = 0;

                int HeaderRowCount = 1;

                int RowCount = sheet_I.PhysicalNumberOfRows;

                //* 實際匯入資料筆數

                int DataRowCount = RowCount - HeaderRowCount;

                //* 表頭資料列的欄位總數 

                int DataColCount = sheet_I.GetRow(0).PhysicalNumberOfCells;


                #region 欄位


                dtImport.Columns.Add("SEG", typeof(string));

                dtImport.Columns.Add("CCID", typeof(string));

                dtImport.Columns.Add("ACCIDNM", typeof(string));

                dtImport.Columns.Add("M1", typeof(string));

                dtImport.Columns.Add("M2", typeof(string));

                dtImport.Columns.Add("M3", typeof(string));

                dtImport.Columns.Add("M4", typeof(string));

                dtImport.Columns.Add("M5", typeof(string));

                dtImport.Columns.Add("M6", typeof(string));

                dtImport.Columns.Add("M7", typeof(string));

                dtImport.Columns.Add("M8", typeof(string));

                dtImport.Columns.Add("M9", typeof(string));

                dtImport.Columns.Add("M10", typeof(string));

                dtImport.Columns.Add("M11", typeof(string));

                dtImport.Columns.Add("M12", typeof(string));

                //dtImport.Columns.Add("ITEMS", typeof(Int32));           

                //dtImport.Columns.Add("TRANSFEE", typeof(decimal));      

                #endregion


                #region 塞值--先塞入datatable在做處理

                for (int i = 1; DataRowCount > i; i++)  //列計數

                {


                    DataRow drImport = dtImport.NewRow();


                    for (int j = 0; 15 > j; j++)  //資料欄位計數

                    {

                        drImport[j] = sheet_I.GetRow(i).GetCell(j);


                        //drImport.Table.Rows[i-1][j]= sheet_I.GetRow(i).GetCell(j);

                        //dtImport.Rows[i-1][j] = 

                    }

                    dtImport.Rows.Add(drImport);

                }



                #endregion


            }

        }

        else

        {

            this.Master.AjaxManager.Alert("檔案格式錯誤");

            MSG = "檔案格式錯誤";

            //檔案錯誤

        }


        if (MSG == "")

        {

            //整理datatable

            if (dtImport.Rows.Count > 0)

            {

                //移除沒有CCID的資料列

                for (int i = 0; dtImport.Rows.Count > i; i++)

                {

                    if (dtImport.Rows[i]["CCID"].ToString() == "")

                    {

                        // dt.Rows[i].Delete();

                        dtImport.Rows.RemoveAt(i);

                    }

                }

         

                

                db.Inport(dtImport, COMPID, Q_ddlDATAYEAR.SelectedValue.ToString(), Q_ddlYEARTYPE.SelectedValue.ToString());

            }


        }


    }

[SQL][sybase]use SQL server OPEN QUERY Sybase with parameter

 Declare @ps_houses char(2)

Declare @ps_housee char(2)

Declare @ps_dates char(8)

Declare @ps_datee char(8)


set @ps_houses = '01' 

set @ps_housee = '31'

set @ps_dates =  (select convert(varchar(8),getdate(),112))

set @ps_datee = (select convert(varchar(8),getdate(),112))


Declare @SQL_str varchar(3000)


set @SQL_str='SELECT distinct   

trf100s.send_no,      

         trf100s.tranio_no,      

         trf100s.raw_no,      

         trf100s.part_no,      

         saf300s.send_qty,      

         saf300s.scan_qty,    

         saf300s.send_qty - saf300s.scan_qty   as no_scanqty ,   

baf008.cust_no,   

baf008.cust_sname,

trf100.house_no,

baf014.house_name

    FROM trf100s  

LEFT JOIN trf100  ON trf100s.send_no = trf100.send_no   

LEFT JOIN baf008  ON baf008.cust_no = trf100s.cust_no   

LEFT JOIN saf300s ON trf100s.send_no = saf300s.send_no    

          and trf100s.tranio_no = saf300s.tranio_no   

and trf100s.part_no = saf300s.part_no

LEFT JOIN baf014 ON trf100.house_no = baf014.house_no    

   WHERE     

   saf300s.send_qty - saf300s.scan_qty   > 0   

and left(saf300s.tranio_no,2) <> ''DI''     

    and saf300s.barcode_yn = ''Y''      

and trf100.house_no between ''' + @ps_houses +''' and ''' +@ps_housee  + ''' and convert(char(8),trf100.send_date,112) between '''+ @ps_dates + ''' and '''+ @ps_datee


SET @SQL_str = 'SELECT * into TMP_LHDBTRP100 FROM OpenQuery(LHDB, ''' + REPLACE(rtrim(@SQL_str)+'''', '''', '''''')+ ''')'


    EXEC(@SQL_str)

[sybase]查詢某字串是否在程式碼裡

 select object_name(id),* from syscomments 

   where texttype = 0 and 

(text like '%turnkey_date%' 

or text like '%turnkey_pick%'

or text like '%turnkey_canceldate%'

or text like '%etrndt%'

)

;

[C#][SQL]unable to cast object of type 'system.dbnull' to type 'system.string'

這個錯誤是說明

從DB搜尋的值,有包含null

困難在於,錯誤不一定會顯示位置,有2個方向查找

1. 檢查C#中,從DB來做轉換的欄位,可以設定null給空白

                string SEG6 = (string)dataRow["SEG6"];

            string SEG6NM = (string)dataRow["SEG6NM"];

2. 檢查搜尋出的值,如下圖,在依欄位找出要修改的地方,或修改where條件,不可以null




[.Net][Report]此報表的定義無效,或是這個版本的 Reporting Services 不支援該報表定義。報表定義可能是以較新版本的 Reporting Services 所建立,或是含有格式不完整或不適用於 Reporting Services 結構描述的內容。詳細資料: 報表定義具有無效的目標命名空間 'http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition',此命名空間無法升級。

此報表的定義無效,或是這個版本的 Reporting Services 不支援該報表定義。報表定義可能是以較新版本的 Reporting Services 所建立,或是含有格式不完整或不適用於 Reporting Services 結構描述的內容。詳細資料: 報表定義具有無效的目標命名空間 'http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition',此命名空間無法升級。

1. 請修改屬性目標server


2. 重建方案

3.重建後的RDL檔,會放在bin\Debug裡,用該檔上傳Server即可

[Javascript]數字檢查以及轉千分位字串

        function formatCurrency(num) {

            num = num.toString().replace(/\$|\,/g, '');

            if (isNaN(num))

                num = "0";

            sign = (num == (num = Math.abs(num)));

            num = Math.floor(num * 100 + 0.50000000001);

            cents = num % 100;

            num = Math.floor(num / 100).toString();

            if (cents < 10)

                cents = "0" + cents;

            for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)

                num = num.substring(0, num.length - (4 * i + 3)) + ',' +

                    num.substring(num.length - (4 * i + 3));

            return (((sign) ? '' : '-') + num + '.' + cents);

        }         

function IsIntText(textControl) {

            var str = textControl.value;

            var regexp = /^([1-9][0-9]*)$/; //正整數

            //    ^-?\d+$  整數含負數

            var msg = '';

            if (!regexp.test(textControl.value)) {

                msg = '數字格式不正確!';

            }

            if (parseInt(str, 10).toString() == '0') {     //表示輸入的是0或0.00啦

                msg = '數字格式不可為0!';

            }

            if( msg != ''){

                alert(msg);

                textControl.value = "";

            }

            else{

                //檢查都過後重算總金額

                //把數字傳給數值欄位計算總金額

                //把字串欄位變成貨幣單位(千分位帶逗點)

                var fgvD2 = document.getElementById("ctl00_ContentPlaceHolder1_fgvD2");

                var totalAMT = 0; //總金額

                var AlltotalAMT = 0; //總金額

                var ORDERAMT = 0; //單價

                var ORDERNUM = 0 ; //數量

                if (fgvD2.rows.length > 0) {

                    for (var i = 1; i < fgvD2.rows.length; i++) {

                        totalAMT = 0;

                        //字串去除逗號

                        //數量字串欄位

                        ORDERNUM = fgvD2.rows[i].cells[3].getElementsByTagName("input")[0].value;

                        ORDERNUM = ORDERNUM.replace(new RegExp(",", ''),''); //replaceall


                        //單價字串欄位

                        ORDERAMT = fgvD2.rows[i].cells[4].getElementsByTagName("input")[0].value;

                        ORDERAMT = ORDERAMT.replace(new RegExp(",", ''),''); //replaceall


                        //單價傳給數值欄位  在.cs pageload給值

                        //fgvD2.rows[i].cells[4].getElementsByTagName("input")[1].value = ORDERAMT;


                        //總金額 = 總金額 + 數量 * 單價

                        totalAMT = (ORDERNUM * ORDERAMT);

                        AlltotalAMT = AlltotalAMT + (ORDERNUM * ORDERAMT);


                        //總金額傳給數值欄位  在.cs pageload給值

                        //fgvD2.rows[i].cells[5].getElementsByTagName("input")[1].value = totalAMT;


                        //金額字串欄位加上貨幣符號(千分位帶逗點)

                        fgvD2.rows[i].cells[4].getElementsByTagName("input")[0].value = formatCurrency(ORDERAMT).toString();

                        fgvD2.rows[i].cells[5].getElementsByTagName("input")[0].value = formatCurrency(totalAMT).toString();

                        //隱藏td關閉

                        //document.getElementById('tdORDERAMT').style.display = 'none';

                        //document.getElementById('tdTOTALAMT').style.display = 'none';

                    }

                    document.getElementById("ctl00_ContentPlaceHolder1_lbTOTALAMT").innerText = formatCurrency(AlltotalAMT).toString();

                    document.getElementById("ctl00_ContentPlaceHolder1_ftbALLTOTALAMT").value = formatCurrency(AlltotalAMT).toString();

                }

            }

        }


        function IsfloatText(textControl) {

            var str = textControl.value;

            var str = textControl.value;

            var regexp = /^[0-9]+.[0-9]{1,2}?$/; //帶2位小數正實數  發現10A1這種無法找出 下方修補邏輯

            var regexp2 = /^([1-9][0-9]*)$/; //正整數

            var msg = '';

            if (!regexp.test(textControl.value) && !regexp2.test(textControl.value)) { //整數或小數

                msg = '數字格式不正確!';

            }

            var regexp2 = /[A-Za-z]/

            if (regexp2.test(textControl.value)) { //若包含字母

                msg = '數字格式不正確!';

            }

            if (parseFloat(str, 10).toString() == '0') {     //表示輸入的是0或0.00啦

                msg = '數字格式不可為0!';

            }

            if (msg != '') {

                alert(msg);

                textControl.value = "";

            }

            else {

                //檢查都過後重算總金額

                //把數字傳給數值欄位計算總金額

                //把字串欄位變成貨幣單位(千分位帶逗點)

                var fgvD2 = document.getElementById("ctl00_ContentPlaceHolder1_fgvD2");

                var totalAMT = 0; //總金額

                var AlltotalAMT = 0; //總金額

                var ORDERAMT = 0; //單價

                var ORDERNUM = 0; //數量

                if (fgvD2.rows.length > 0) {

                    for (var i = 1; i < fgvD2.rows.length; i++) {

                        totalAMT = 0;

                        //字串去除逗號

                        //數量字串欄位

                        ORDERNUM = fgvD2.rows[i].cells[3].getElementsByTagName("input")[0].value;

                        ORDERNUM = ORDERNUM.replace(/,/, '');


                        //單價字串欄位

                        ORDERAMT = fgvD2.rows[i].cells[4].getElementsByTagName("input")[0].value;

                        ORDERAMT = ORDERAMT.replace(/,/, '');


                        //單價傳給數值欄位  在.cs pageload給值

                        //fgvD2.rows[i].cells[4].getElementsByTagName("input")[1].value = ORDERAMT;


                        //總金額 = 總金額 + 數量 * 單價

                        totalAMT = (ORDERNUM * ORDERAMT);

                        AlltotalAMT = AlltotalAMT + (ORDERNUM * ORDERAMT);


                        //總金額傳給數值欄位  在.cs pageload給值

                        //fgvD2.rows[i].cells[5].getElementsByTagName("input")[1].value = totalAMT;


                        //金額字串欄位加上貨幣符號(千分位帶逗點)

                        fgvD2.rows[i].cells[4].getElementsByTagName("input")[0].value = formatCurrency(ORDERAMT).toString();

                        fgvD2.rows[i].cells[5].getElementsByTagName("input")[0].value = formatCurrency(totalAMT).toString();

                        //隱藏td關閉

                        //document.getElementById('tdORDERAMT').style.display = 'none';

                        //document.getElementById('tdTOTALAMT').style.display = 'none';

                    }

                    document.getElementById("ctl00_ContentPlaceHolder1_lbTOTALAMT").innerText = formatCurrency(AlltotalAMT).toString();

                    document.getElementById("ctl00_ContentPlaceHolder1_ftbALLTOTALAMT").value = formatCurrency(AlltotalAMT).toString();

                }

            }

        }

[DataSet Bug]無法啟用條件約束。一或多個資料列的值違反非 Null、唯一或外部索引鍵條件約束

在使用TableAdapter作Query時發生 1. 原因為有些資料欄位Query出來後為null值 但是該欄位在dbDataSet的屬性AllowDBNull為False 因此把該欄位(或乾脆把全部欄位屬性AllowDBNull改為True 2. maxLength 檢...