2011-11-21 19 views
7

Tôi muốn biết cách cập nhật nguồn dữ liệu bảng tổng hợp hiện có. Tôi đang sử dụng Microsoft.Office.Interop.Excel và nhắm mục tiêu người dùng bằng Excel 2010.Làm cách nào để cập nhật nguồn dữ liệu PivotTable bằng C#?

Tôi hiện có thể làm mới bảng tổng hợp hoạt động tốt, tuy nhiên khi có thêm hàng, tôi muốn bao gồm các hàng này trong nguồn dữ liệu bảng tổng hợp. Ví dụ: nguồn dữ liệu bảng tổng hợp khi được xem trong Excel là DataSourceWorksheet!$A$2:$U$26 và tôi muốn nó được đổi thành DataSourceWorksheet!$A$2:$U$86 (thêm 60 hàng) sau khi mã tệp excel cập nhật/làm mới của tôi đã chạy.

Dưới đây là một phiên bản đơn giản hóa của mã của tôi

Application excelApplication = new Application(); 
Workbooks workbooks = excelApplication.Workbooks; 
wrkBook = workbooks.Open(EXCEL_DOCUMENT_PATH, Missing.Value, false, Missing.Value, 
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, true, Missing.Value, Missing.Value, 
        Missing.Value, Missing.Value, Missing.Value); 

/* update data source worksheet code here (omitted for example) */ 

Worksheet pivotWorkSheet = (Worksheet)wrkBook.Sheets[PIVOT_SHEET_NAME]; 
PivotTable pivot = (PivotTable)pivotWorkSheet.PivotTables(pivotTableName); 

/* I would like to update the pivot tables data source here... 

    I could use Range object from data source worksheet... 

    Basically just want to tell pivot table, use these cells now... */ 

pivot.RefreshTable(); 

/* cleanup code here (omitted for example) */ 

Một giải pháp mà có thể làm việc, sẽ chỉ tạo các bảng pivot một lần nữa sử dụng wrkBook.PivotTableWizard(...). Tuy nhiên, điều này sẽ không hoạt động cho tình huống của tôi vì người dùng muốn sửa đổi bảng tổng hợp của họ bằng cách thay đổi các trường, hàng, cột, v.v. được chọn chỉ cần được cập nhật khi bảng nguồn dữ liệu thay đổi.

+1

Không chắc tại sao điều này lại bị bỏ phiếu, có vẻ như là một câu hỏi hợp lý đối với tôi. – neontapir

+0

Vâng, tôi không chắc chắn, đây không phải là loại điều mà tôi đã tìm thấy dễ dàng trên MSDN hoặc trong các tài nguyên tương tự. –

Trả lời

2

Giải pháp cho vấn đề này là sử dụng Dynamic Named Range trong excel cho nguồn dữ liệu Bảng Pivot. Dãy công thức động đặt tên sử dụng một sự kết hợp của OFFSET functionCOUNTA function như vậy:

=OFFSET(DataSourceWorksheet!$A$2,0,0,COUNTA(DataSourceWorksheet!$A$2:$A$1000),1) 

Công thức trên sẽ gây ra một loạt các tế bào trong A2: A1000 có dữ liệu. Trong trường hợp của tôi, tôi yêu cầu nhiều hơn một cột và tôi có nhiều hàng hơn để 'kiểm tra' dữ liệu.

Bây giờ trong C# để tạo ra một loạt tên tôi sử dụng như sau:

Names wrkBookNames = wrkBook.Names; 
string dynamicRangeFormula = "=OFFSET(DataSourceWorksheet!$A$2,0,0,COUNTA(DataSourceWorksheet!$A$2:$A$1000),1)"; 
wrkBookNames.Add("MyNamedRange", dynamicRangeFormula); 

và sau đó để xác định rằng tên phạm vi là nguồn dữ liệu khi tạo bảng pivot mới tôi chỉ đơn giản là chỉ cần vượt qua chuỗi giá trị của các tên loạt vào phương pháp PivotTableWizard:

//get range for pivot table destination 
Range pivotDestinationRange = pivotWorkSheet.get_Range("A1", Type.Missing); 

wrkBook.PivotTableWizard(
        XlPivotTableSourceType.xlDatabase, 
        "MyNamedRange", 
        pivotDestinationRange, 
        pivotTableName, 
        true, 
        true, 
        true, 
        true, 
        Type.Missing, 
        Type.Missing, 
        false, 
        false, 
        XlOrder.xlDownThenOver, 
        0, 
        Type.Missing, 
        Type.Missing 
        ); 

Bây giờ khi hàng được thêm vào hoặc xóa trong DataSourceWorkSheet các pivot table sẽ chỉ được tham khảo các tế bào với các giá trị dữ liệu bằng cách sử dụng dãy tên. Làm mới bảng pivot tại chỉ hoạt động như mong đợi, bằng cách gọi RefreshTable:

PivotTable pivot = (PivotTable)pivotWorkSheet.PivotTables(pivotTableName); 

pivot.RefreshTable(); 

Nhìn chung, điều này sẽ xảy ra trong vòng một phương pháp để tạo ra một bảng tính excel mới hoặc cập nhật một bảng tính hiện có. Gọi phương thức này cho một sổ làm việc hiện có dựa trên thực tế, bảng tổng hợp hiện tại đã được tạo bằng cách sử dụng dải ô được đặt tên động và sẽ được cập nhật tương ứng.

+0

Nếu bất kỳ người dùng SO nào khác thấy điều này hữu ích hoặc muốn xem một ví dụ làm việc, hãy cho tôi biết. –

5

của nó rất đơn giản ..

pivot.SourceData = "SheetName!R1C1:R18C18" 
pivot.RefreshTable(); 

Thats tất cả ..

Hãy nhớ rằng, luôn luôn chúng ta cần phải cung cấp cho Row và định dạng cột.

Ví dụ:

"SheetName!" + R + Rowstartingnumber + C + Column StartingNumber : R + Rowendnumber + C + Column Endnumber. 

tức là "SheetName!R1C1:R12C13" như thế.

Nếu bạn cung cấp "SheetName!$A$1:$Q$18" như thế này, nó sẽ không hoạt động.

Các vấn đề liên quan