我试图通过使用Microsoft Interop c#来检测Microsoft Excel中的单元格是否包含数据透视表#
我想要做的是循环遍历所有单元格,如下面的代码所示,然后如果单元格包含数据透视表,我想将该单元格的行和列信息存储为整数值:
@InitBinder
public void initBinder(WebDataBinder binder) {
// Although spring says it is automatic
binder.addCustomFormatter(new DateFormatter("dd-mm-yyyy"));
}
我已经尝试查看MSDN和其他来源,但似乎找不到任何方法来检测单元格是否包含数据透视表。
感谢任何帮助,谢谢。
答案 0 :(得分:5)
以下是一些供参考的代码。 确定工作表中数据透视表占用的整个范围,并验证该单元格是否是范围的一部分。
private Excel.Range IdentifyPivotRanges(Excel.Range xlRange)
{
Excel.Range pivotRanges = null;
Excel.PivotTables pivotTables = xlRange.Worksheet.PivotTables();
int pivotCount = pivotTables.Count;
for (int i = 1; i <= pivotCount; i++)
{
Excel.Range tmpRange = xlRange.Worksheet.PivotTables(i).TableRange2;
if (pivotRanges == null) pivotRanges = tmpRange;
pivotRanges = this.Application.Union(pivotRanges, tmpRange);
}
return pivotRanges;
}
private void CheckCellsForPivot(Excel.Range xlRange)
{
Excel.Range pivotRange = IdentifyPivotRanges(xlRange);
int rowCount = xlRange.Rows.Count;
int colCount = xlRange.Columns.Count;
for (int iRow = 1; iRow <= rowCount; iRow++)
{
for (int iCol = 1; iCol <= colCount; iCol++)
{
var cell = xlRange.Cells[iRow, iCol];
if (Application.Intersect(pivotRange, cell) != null)
{
int rowLocation = iRow;
int colLocation = iCol;
}
}
}
}
答案 1 :(得分:1)
看看这里有几个关于循环数据透视表列表的例子
id | type | allowance_value |
1 | Meal Allowance | 100.00 |
2 | Travel Allowance | 150.00 |
答案 2 :(得分:1)
扩展CS的答案:我使用了CS的答案,但进行了一些修改,以便您只需要工作簿的路径。无需范围,只需传递工作簿中的工作表即可。
#region PivotTables
public static List<DataTable> PivotCollection(string filePath)
{
List<DataTable> pivotCollection = new List<DataTable>();
//Get Workbook
xl.Application app = new xl.Application();
xl.Workbook wb = null;
wb = app.Workbooks.Open(filePath);
//Loop through each worksheet and find pivot tables to add to collection
foreach (xl.Worksheet ws in wb.Worksheets)
{
//Get range of pivot table
string wsName = ws.Name.ToString();
xl.Range pivotRange = GetPivotRange(ws);
//Check if there is any table to add
if (pivotRange == null) continue;
DataTable pivotTable = DataTables.FromRange(pivotRange);
//Get info from range and add to pivot
pivotCollection.Add(pivotTable);
}
return pivotCollection;
}
//Find Pivot table in worksheet
//CS's Code with slight modification, use worksheet instead of range
public static xl.Range GetPivotRange(xl.Worksheet xlworkSheet)
{
xl.Range pivotRanges = null;
xl.PivotTables pivotTables = xlworkSheet.PivotTables();
int pivotCount = pivotTables.Count;
for (int i = 1; i <= pivotCount; i++)
{
xl.Range tmpRange = xlworkSheet.PivotTables(i).TableRange2;
if (pivotRanges == null) pivotRanges = tmpRange;
pivotRanges = tmpRange;
}
return pivotRanges;
}
#endregion