2014年7月4日 星期五

將DataSet轉成Excel


整個是一個Application
Book1是一個活頁簿
Sheet1是一個工作表
ColumnName是標題1、標題2、標題3
Cell是裡面的表格




使用套件Microsoft.Office.Interop.Excel;

//new 一個 Excel
Application application = new Application();
//在excel中加入新的活頁簿
Workbook wBook = application.Workbooks.Add(Type.Missing);

for (int z = 0; z < dsData.Tables.Count; z++)
{
    //建立新的工作表
    Worksheet workSheet = (Worksheet)wBook.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    workSheet.Name = dsData.Tables[z].TableName;

    //column headings
    for (int i = 0; i < dsData.Tables[z].Columns.Count; i++)
    {
        Range headRange = (Range)workSheet.Cells[1, i + 1];
        headRange.Font.Bold = true; //粗體
        headRange.Value2 = dsData.Tables[z].Columns[i].ColumnName;
    }

    //rows
    for (int i = 0; i < dsData.Tables[z].Rows.Count; i++)
    {
        //cells
        for (int j = 0; j < dsData.Tables[z].Columns.Count; j++)
        {
            workSheet.Cells[(i + 2), (j + 1)] = dsData.Tables[z].Rows[i][j];
        }
    }
}

wBook.SaveAs(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    XlSaveAsAccessMode.xlShared, XlSaveConflictResolution.xlLocalSessionChanges, false, Type.Missing, Type.Missing, Type.Missing);

application.Quit();


其中Workbook.SaveAs的參數可參考以下連結:

2014年6月19日 星期四

Crystal Report 錯誤 - (0x8002000B): 無效的索引。

System.Runtime.InteropServices.COMException (0x8002000B): 無效的索引。 (發生例外狀況於 HRESULT: 0x8002000B (DISP_E_BADINDEX)) CrystalDecisions.ReportAppServer.DataDefModel.FieldsClass.get_Item(Int32 Index) CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinitions.get_Item(Int32 index) CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinitions.get_Item(String fieldName) CrystalDecisions.CrystalReports.Engine.ReportDocument.SetParameterValue(String name, Object val) 

以上很明顯看出是設定參數時發生錯誤。

報表的欄位可以分很多種,如下圖:

//這裡是設定資料庫欄位的綁定
rpDoc.SetDataSource(dtFinall);
//這裡是設定參數欄位的綁定
rpDoc.SetParameterValue("formno", dtFinall.Rows[0]["formno"].ToString());
rpDoc.SetParameterValue("orderno", dtFinall.Rows[0]["orderno"].ToString());
rpDoc.SetParameterValue("budget_code", dtFinall.Rows[0]["budget_code"].ToString());
rpDoc.SetParameterValue("batchno", dtFinall.Rows[0]["batchno"].ToString());
rpDoc.SetParameterValue("vat_num", dtFinall.Rows[0]["vat_num"].ToString());
rpDoc.SetParameterValue("supp_nm", dtFinall.Rows[0]["supp_nm"].ToString());
rpDoc.SetParameterValue("addr", dtFinall.Rows[0]["addr"].ToString());
rpDoc.SetParameterValue("work", dtPur_Basic.Rows[0]["purchaser_nmc"].ToString());

而錯誤主要是找不到參數欄位,明明有formno、orderno等欄位,但是在參數欄位中卻沒有設定,程式match不到就出錯了。

This error occurs when your parameters not matched in both reports & coding. May be your parameter name is wrong. So verify the parameters & parameter names are same in report & your coding.