讯光科技
Report
  • OfficeTools
  • CrystalReport
  • ReportViewer

OfficeTools

當前位置:首頁>常見問答>Report



使用ExcelPlate,如何不要透過Excel即可直接印表? 可以在ExcelPlate的AfterOutput事件中加入印表的程式,如下: using System.Reflection; using System.Runtime.InteropServices; private void excelPlate1_AfterOutput(object sender, EventArgs e) { Excel.Application objExcel = new Excel.Application(); objExcel.Visible= false; Excel.Workbook objWorkBook = objExcel.Workbooks.Open(excelPlate1.FilePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); try { objWorkBook.PrintOut(1, 1, 1, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value); } finally { objExcel.Quit(); Marshal.ReleaseComObject(objExcel); Marshal.ReleaseComObject(objWorkBook); objExcel = null; objWorkBook = null; GC.Collect(); } } PrintOut為打印的函數,第一個參數是打印起始頁,第二個參數打印結束頁,第三個參數是打印的份數
使用ExcelPlate每一次列印至 Excel時, 出現”output.xls has already exsited.Would you like to overwrite it”,應如何解決? 這是防止在輸出過程中,會覆蓋原來存在的Excel檔案所做的警告,如果檔案不存在的話是不會彈出警告的,所以可以在ExcelPlate.Output()前刪除這個檔案,如下: Using System.IO; string filepath = string.Empty; if (excelPlate1.OutputPath.EndsWith("\\")) { filepath = excelPlate1.OutputPath + excelPlate1.OutputFileName; } else { filepath = excelPlate1.OutputPath + "\\" + excelPlate1.OutputFileName; } if (File.Exists(filepath)) { try { File.Delete(filepath); } catch { } }
如何對ExcelPlate中某一行設定格式? ExcelPlate 的格式是要求先設定的,所以對於這種需求,需要另外寫代碼來實現. 如:對A1單元格畫底線,範例代碼如下: 需要添加Excel.dll引用,可以在OfficeTools下找到 using System.Reflection; using System.Runtime.InteropServices; string file = @"c:\test.xls";//xls的檔案名 Excel.Application application = new Excel.Application();//打開Excel進程 Excel.Workbook workBook = null; Excel.Worksheet workSheet = null; Excel.Range cell = null; try { application.Visible = false;//不顯示Excel程式 application.DisplayAlerts = false;//不顯示確認窗口 workBook = application.Workbooks.Open(file, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);//打開文件 workSheet = workBook.Worksheets[1] as Excel.Worksheet;//取得第一個WorkSheet cell = workSheet.get_Range("A1", "A1");//取得A1這個單元格 cell.Font.Underline = true;//設置下劃線 workBook.Save();//保存檔 } finally { application.Quit();//退出Excel進程 Marshal.ReleaseComObject(application);//釋放Excel進程 Marshal.ReleaseComObject(workBook);//釋放Excel進程 Marshal.ReleaseComObject(workSheet);//釋放Excel進程 Marshal.ReleaseComObject(cell);//釋放Excel進程 application = null; workBook = null; workSheet = null; cell = null; GC.Collect();//回收 }
如何在ExcelPlate的AfterOutput事件中加入列印的代碼? using System.Reflection; using System.Runtime.InteropServices; private void excelPlate1_AfterOutput(object sender, EventArgs e) { Excel.Application objExcel = new Excel.Application(); objExcel.Visible= false; Excel.Workbook objWorkBook = objExcel.Workbooks.Open(excelPlate1.FilePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); Try { objWorkBook.PrintOut(1, 1, 1, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value); } Finally { objExcel.Quit(); Marshal.ReleaseComObject(objExcel); Marshal.ReleaseComObject(objWorkBook); objExcel = null; objWorkBook = null; GC.Collect(); } } PrintOut為列印的函數,第一個參數是列印起始頁,第二個參數列印結束頁,第三個參數是列印的份數。
請問如何下載ExcelPlate產生出虛擬目錄之Excel檔案? 可以在Button_Click事件中添加如下代碼: FileInfo DownloadFile = new FileInfo("C:\\1.xls");//這裏換成excel檔的完整路徑,可以用Page.Server.MapPath(WebExcelPlate.FilePath)來取得 Response.Clear(); Response.ClearHeaders(); Response.Buffer = false; Response.ContentType = "application/octet-stream";//attachment/online Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8).Replace('+', ' ')); Response.AppendHeader("Content-Length", DownloadFile.Length.ToString()); Response.WriteFile(DownloadFile.FullName); Response.Flush(); Response.End();
用什麼樣的方法可以讓檔下載後自動打開? 1. WebForm COM組件中加入Microsoft.Office.Interop.Excel,讓Excel.Application 可以使用. Excel.Application Myexcel=new Excel.Application(); Myexcel.Workbooks.Open(filename, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing); 2. WinForm 下載後WinForm可以通過 System.Diagnostics.Process.Start方法,如: System.Diagnostics.Process.Start(@"C:\test.txt");來用默認的程式打開文件。
如何用程式實現word查找替換方法,現有方法出現”OfficeTools字串參數太長”錯誤訊息? 查找替換功能有字元數的限制,替換的最大長度為255個字元,應該直接修改Word中的Sentences或者Words對象來實現,如: OpenFileDialog dialog = new OpenFileDialog(); if (dialog.ShowDialog() == DialogResult.OK) { StreamReader reader = new StreamReader(dialog.FileName, Encoding.UTF8); string text = reader.ReadToEnd(); reader.Close(); Word.Application objWord = new Word.Application(); if (objWord == null) { throw new Exception("Word could not be started. Check that your office installation and project references are correct"); } objWord.Visible = true; objWord.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; object objMiss = Missing.Value; Word.Document objDocument = objWord.Documents.Add(ref objMiss, ref objMiss, ref objMiss, ref objMiss); try { objDocument.Sentences[1].Text = text; object filename = dialog.FileName + ".doc"; objDocument.SaveAs(ref filename, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss); } finally { ((Word._Application)objWord).Quit(ref objMiss, ref objMiss, ref objMiss); Marshal.ReleaseComObject(objDocument); Marshal.ReleaseComObject(objWord); objDocument = null; objWord = null; objMiss = null; GC.Collect(); } }

CrystalReport

當前位置:首頁>常見問答>Report


WEB項目能否在水晶報表點擊打印按鈕直接打印 可以通過新增一個Button元件,然後在Click事件如下的寫法: CrystalDecisions.CrystalReports.Engine.ReportDocument rd = new CrystalDecisions. CrystalReports.Engine.ReportDocument(); rd.Load(Server.MapPath("CRPOS.rpt")); rd.PrintOptions.PrinterName = "EPSON ME 1"; try { rd.PrintToPrinter(1, true, 0, 0); } catch { Response.Write("<script language='javascript'>alert('打印失?');</script>"); }
在水晶報表中如何實現欄位代號去找關連表單的相對資料(如名稱等)? 報表只能打印資料表的內容,無法自動去關聯其他table的內容,所以必須在原來的InfoCommand中,增加Left Join的語法,將對方所要列印的欄位加入即可列印。
設計好的報表,為何發佈后執行時發生:The type initializer for 'CrystalDecisions. CrystalReports. Engine.ReportDocument' threw an exception. 如果你要發布執行CrystailReport,而且這台IIS Server上有沒有安裝Visual Studio的情況下,必須要做2個步驟: 1.請右鍵預設網站,選擇屬性,打開“默認網站屬性”視窗,在視窗裏選擇【主目錄】頁籤,把本地路徑C:\Inetpub\wwwroot記錄下來,然後在Server機的C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ASP.NETClientFiles\路徑下找到CrystalReportWebFormViewer3資料夾,在Client端的C:\Inetpub\wwwroot路徑下新建\aspnet_client\System_Web\2_0_50727路徑,并把CrystalReportWebFormViewer3資料夾复制到C:\Inetpub\wwwroot\aspnet_client\System_Web\2_0_50727\路徑下。 2.在C:\ProgramFiles\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\ CrystalReports\資料夾下找到CRRedist2005_x86.msi文件,用戶要把CrystalReport發布到哪台機器(沒有VS的),就將此文件複製到那台機器並安裝此文件。
有一個報表是要印標籤的,由於標籤的位置是固定的,但要從哪一個標籤開始印是不一定的,(例:一張標籤紙有24張小標籤紙,但有時候要由第8張開始印,有時候要由第6張開始印),請問要如何動態去控制報表列印的位置? 可以在資料中添加一些空記錄,比如從第6張開始印,就添加5筆。在資料中依據實際增加一定數量的記錄。比如我要從3開始印,就需要添加2筆記錄,一般只有key欄位是必須設定值的,keyfield的值可以使用你資料表確定沒有的值,其他欄位可以依據自己的情況。 DataRow dr; for (...) { dr = idMaster.RealDataSet.Tables[0].NewRow(); dr[keyfield] = ... idMaster.RealDataSet.Tables[0].Rows.InsertAt(dr,0); } 以上程式寫在給報表賦DataSet前,比如MyReport.SetDataSource(Master.RealDataSet)這行程式前。
CrystalReport在發布後執行, 為何會出現一個資料庫登入的畫面? 在執行Crystal Report報表時,如果沒有將對應的xml分發到 EEP2006\EEPNetReport之下的話, 就會出現此訊息。報表所對應的Xml檔,應該只用於設計模式中用來設計報表所使用,但在RunTime啟動時,Crystal Report雖然不會去到XML中去得取資料,資料是由你所控制的WebDataSource所提供,但實際上在Crystal Report啟動的那個瞬間,還是必須要有XML作為啟動報表的資料源,有2種方法可以避免這種現象,如下: 1. 在設計畫面中,點擊ReportViewer的右上角,點擊“Clear Report Source”,這個方法的執行結果是在Form開啟的時候不會顯示資料,只有當查詢後才會顯示,所以可以避免此錯誤發生。 2. 在Form_Load的事件中,增加程式來設定報表的資料源。這種方法的運行結果是在Form打開的一瞬間就可以看到報表,如下: MyReport11.SetDataSource(myInfoDataSet.RealDataSet); crystalReportViewer1.ReportSource = MyReport11;
Crystal Report如何ClientQuery的條件? 如下Sample,可以用下列方法來達成: protected void Button1_Click1(object sender, EventArgs e) //印表程式 { WebClientQuery1.Excute(Panel1, true); // 處理條件 TextObject memo=(TextObject) CrystalReportSource1.ReportDocument.ReportDefinition.Sections["Section2"].ReportObjects["Text7"]; //取得Crystal Report Section2.Text7 memo.Text = WebClientQuery1.GetText(); //設定Text7.Text CrystalReportViewer1.RefreshReport(); // 印表 }
如何在Crystal Report中顯示資料表中單價及數量欄位相乘後的總價? 可供選擇方法: 1. 最簡單的方法,就是sql語句直接取得,在報表中只要多顯示一個欄位就可以。 2. 在報表的欄位資源管理器中增加“公式欄位”,再編輯相應的計算公式。 3. 在報表的Detail中增加一個欄位,然後在這個TextObject元件中寫程式返回兩個欄位的乘積。
報表的顯示,變為一個欄位各佔一行,且在報表上多了一些虛線的空白行? 可能是由於網頁中使用了css造成的,請打開Form後,檢視檔的原始檔,將多餘的鏈接css的部分刪除,如圖: <img src="http://www.infolight.com.tw/WebClient/Image/FAQ/Q331.jpg" />
請問一下可以在報表FORM中以程式控制報表群組的欄位嗎? 直接控制報表的群組不太容易實現,建議採用如下的方式,多定義一個欄位(可以在Select語句中用select ‘ ’ as field1),報表固定使用這個欄位做?群組欄位。在顯示報表前,可以將想要分組的欄位的內容用程式寫入到DataSet中的field1欄位,這樣報表也不需要特別的設計了。
欄位名稱一樣,資料表不一樣的報表可以共用嗎? 如果兩個資料來源的結構完全一樣,也可以用以下程式: DataSet ds = infoDataSet1.Execute("select ...."); ds.Tables[0].TableName = "YouTableName"; CrystalReport11.SetDataSource(ds); crystalReportViewer1.ReportSource = CrystalReport11; 以上程式中,TableName的設定非常重要,因為報表的顯示是區別TableName的,所以應該設定成跟您的報表上的一樣。
設計Client端Crystal Report,完成後重新建置,出現沒有型別的錯誤訊息? 錯誤是因語句this.cTR01rs1 = new cTR01rs.cTR01rs();引起的。一般選擇一個報表後,產生的程式應該是:this.xxx = new dll.Report();其中dll是這個報表所在的工程build出的,Report是你報表的class名字。若是將此dll與Report設為同名,則會引發該錯誤,這是因為VS編輯器會把cTR01rs識別為Report的Class,而new關鍵字後面的那個cTR01rs應該為Namespace才對,這應該是VS2005的BUG。
如何在報表列印前,對其進行排序? 水晶報表本身有提供排序的功能,在報表設計畫面,右鍵選『Report』-『Record Sort Export』.在此可以設定需要排序的內容,以及排序的規則. 在列印的程式中,加上using CrystalDecisions.CrystalReports.Engine; 並在(crystalReportViewer1.ReportSource=CEE00RL1前面)增加如下程式: SortField stF = CEE00RL1.DataDefinition.SortFields[i]; stF.Field = CEE00RL1.Database.Tables[0].Fields[FieldName]; stF.SortDirection = CrystalDecisions.Shared.SortDirection.DescendingOrder
Crystal Report報表如何更換欄位的顯示名稱? 1. 直接在報表中更改。 2. 如果是動態的話就需要寫程式。 (CrystalReport11.Section2.ReportObjects["Text2"] as TextObject).Text = "Your Value"; CrystalReport11是ReportDocument元件的名字,其他的內容可以依據自己的實際情況做修改,也可以用以下方式: TextObject Text1 = rdc.ReportDefinition.ReportObjects["Text1"] as TextObject; if (Text1 != null) Text1.Text = "單位";
請問要如何控制Crystal Report的匯出檔案格式及檔名? //CHIP_Style1為CHIP_Style.rpt CHIP_Style1.SetDataSource(Master.RealDataSet); setReportParameter(CHIP_Style1, REPORT_STYLE); //由ExportToDisk該方法產生 //第一參數為產出格式,第二參數為產出之路徑檔名 CHIP_Style1.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.WordForWindows, tOutFile.ToString());
如何讓報表即時更新? 1. 先讓Master更新,比如重新Active,或者SetWhere (Master為資料來源InfoDataset) 2. 然後執行crystalReportViewer1.RefreshReport();
如何將Stored Procedure的結果丟到Client端的InfoDataSet呢? 這個可以通過一些變通的方法實現 1. 在Server端放一個InfoCommand,sql語句設成跟您存儲過程返回回來的欄位一樣,例如:select 'abc' as f1, 0.0 as f2....from table where 1=0 只是為了取得table的結構而已。 2. 在Client端使用一個InfoDataSet,比如叫Master,就關聯到步驟1的InfoCommand。 3. 按照Report正常設計。 4. 在設定資料來源時,改成如下: if (ret[0].ToString() == "0") { //將返回的內容導入到Master中,這樣就可以用報表顯示出來 Master.RealDataSet.Tables[0].Merge((DataTable)ret[1]); idgStat.DataSource = ret[1];//這個是用於顯示在Gridview上. //再加上下麵兩句,就將報表顯示出來了 this.CrystalReport11.SetDataSource(Master.RealDataSet); crystalReportViewer1.ReportSource = CrystalReport11; } 以上程式,請依據自己的環境適當修改。
報表在運行出現資料庫登陸框? 在運行報表時如果將對應的xml刪除會出現DataBase的登陸對話框,有2種方法可以避免這種現象,可按各自的需要選擇: 1. 如設計檔所說,在設計畫面,點擊ReportViewer的右上角,點擊“Clear Report Source”,這種方法的運行結果是在Form開啟的時候不會顯示資料,只有當查詢後才會顯示。 2. 在Form_Load的事件中,增加程式來設定報表的資料源,這種方法的運行結果是在Form打開的一瞬間就可以看到報表,增加的程式: MyReport11.SetDataSource(myInfoDataSet.RealDataSet); crystalReportViewer1.ReportSource = MyReport11;
發佈後,USER點印表會將整個Client當掉,提示資訊:The type initializer for 'CrystalDecisions.CrystalReports.Engine.ReportDocument' threw an exception 請安裝CRRedist2005_x86.msi,該文件請至Visual Studio2005的安裝目錄下Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\CrystalReports查找。
在Server端增加一欄位,並且將Client的DataSet重新Save to Report且xml檔中也已增加新的欄位,但報表的欄位如何更新? 1. 右鍵選中DataBase Fields,選擇"LogOn or Off Server"。 2. 選擇Create New connection\ADO.NET\NewDataSet。 3. 點擊Log off按鈕,並關閉。 4. 右鍵選中Database Fields,選擇“Verify DataBase” 。
分發到IIS後,RUN Crystal Report發生下列訊息時:The report you requested requires further information.? 這是因為RunTime時,你沒將EEP2006\EEPNetReport之下的XML也分發過去,可使用copy或FTP將這些XML文檔分發過去。
WEB項目能否在水晶報表點擊列印按鈕直接列印? 可通過新增一個BUTTON控制項然後寫CODE解決 CrystalDecisions.CrystalReports.Engine.ReportDocument rd = new CrystalDecisions.CrystalReports.Engine.ReportDocument(); rd.Load(Server.MapPath("CRPOS.rpt"));//CRPOS.rpt為所製作的rpt文件的全稱 rd.PrintOptions.PrinterName = "EPSON ME 1"; try { rd.PrintToPrinter(1, true, 0, 0); } catch { //提示 Response.Write("<script language='javascript'>alert('列印失敗');</script>"); } 以上設置可實現服務器端的直接列印,客戶端的直接列印通過JAVASTRIPT調用IE列印或自己做ActiveX實現。
如何在水晶報表中顯示其他table的欄位,如將ProductId顯示為ProductName? 報表只能列印資料庫的內容,不能自動去關聯其他table的內容,變通的方法如下: 1. Form1的Master在Server端生成一個關聯欄位,left join進來這個欄位,然後就列印這個欄位,而不是原來的id欄位。 2. 印表的資料與編輯的資料設定為不同來源,印表的資料來源left join這個欄位,同樣列印的時候選擇這個說明欄位: 方法1是可以省略一個資料來源,缺點是在新增編輯的時候要同步處理這個欄位的值。 方法2就需要多一個DataSet,且要在列印的時候去做SetWhere,選中目前這筆資料。
報表中如何設置線條物件為垂直顯示? 選中線條物件,在報表中鼠標左鍵按住垂直拖動即可出現垂直線條。
Client上有沒有安裝Visual Studio時,水晶報表發佈時的註意事項為何? 必須要做2個步驟: 1. 請右鍵預設網站,選擇屬性,打開“默認網站屬性”視窗,在視窗裏選擇主目錄選項,把本地路徑C:\Inetpub\wwwroot記錄下來,然後在Server機的C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ASP.NETClientFiles\路徑下找到CrystalReportWebFormViewer3資料夾,在Client端的C:\Inetpub\wwwroot路徑下新建\aspnet_Client\System_Web\2_0_50727路徑,並把CrystalReportWebFormViewer3資料夾複製到C:\Inetpub\wwwroot\aspnet_Client\System_Web\2_0_50727\路徑下。 2. 在C:\ProgramFiles\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\CrystalReports\資料夾下找到CRRedist2005_x86.msi文件,用戶要把CrystalReport發佈到哪台機器(沒有VS的),就將此文件複製到那台機器並安裝此文件。
Crystal Report 的各區段上下高度, 如何微調? 1. 選中此Section(選中的section顏色會有變化)。 2. 直接看屬性視窗。 3. 如果還是找不到,那就點中report空白處(左鍵)然後檢視屬性視窗,從上面直接選要設定的Section也可以。
如何實現CrystalReport的BARCODE? 可以直接儲存於Windows\Fonts下,然後在控制臺的字形裡安裝新字形,選SMbarcode字形就是條碼了,條碼集請下載: http://www.infolight.com/download/QAFiles/SMbarcode.rar

ReportViewer

當前位置:首頁>常見問答>Report


如何找出ReportView下方之訊光科技股份有限公司圖檔路徑? 1. 選中Report,右擊滑鼠『內容』,其中有EmbeddedImages屬性,可以設定圖片,可以添加或者修改。 2. 選中報表上的Image元件,再更改Value屬性的值,如圖: