Voraussetzungen und Abhängige mit JavaScript via C++
Einführung
- Vorgängerzellen sind Zellen, auf die in einer anderen Zelle eine Formel verweist. Wenn beispielsweise Zelle D10 die Formel =B5 enthält, dann ist die Zelle B5 ein Vorgänger von Zelle D10.
- Abhängige Zellen enthalten Formeln, die sich auf andere Zellen beziehen. Zum Beispiel, wenn Zelle D10 die Formel =B5 enthält, ist D10 abhängig von B5.
Um die Tabelle übersichtlicher zu gestalten, möchten Sie möglicherweise klar zeigen, welche Zellen in einer Tabelle in einer Formel verwendet werden. Ebenso möchten Sie die abhängigen Zellen anderer Zellen extrahieren.
Aspose.Cells ermöglicht es Ihnen, die Zellen zu verfolgen und herauszufinden, welche verknüpft sind.
Vorgänger- und Abhängige Zellen verfolgen: Microsoft Excel
Formeln können sich ändern, basierend auf Änderungen, die von einem Kunden vorgenommen wurden. Wenn beispielsweise die Zelle C1 von C3 und C4 abhängt, die eine Formel enthalten, und C1 geändert wird (d. h. die Formel überschrieben wird), müssen C3 und C4 oder andere Zellen entsprechend den Geschäftsregeln angepasst werden, um die Tabelle auszugleichen.
Ebenso angenommen, C1 enthält die Formel “=(B122)/(M2N32)”. Ich möchte die Zellen finden, von denen C1 abhängt, d. h. die vorhergehenden Zellen B1, M2 und N32.
Sie müssen möglicherweise die Abhängigkeit einer bestimmten Zelle zu anderen Zellen verfolgen. Wenn Geschäftsregeln in Formeln eingebettet sind, möchten wir die Abhängigkeit herausfinden und einige Regeln entsprechend ausführen. Ebenso, wenn der Wert einer bestimmten Zelle geändert wird, welche Zellen im Arbeitsblatt sind von dieser Änderung betroffen?
Microsoft Excel ermöglicht es Benutzern, Vorgänger und Abhängige zu verfolgen.
- Auf der Ansichts-Symbolleiste wählen Sie Formelüberwachung aus. Der Dialog zur Formelüberwachung wird angezeigt.
- Vorgänger verfolgen:
- Wählen Sie die Zelle aus, die die Formel enthält, für die Sie Vorgängerzellen finden möchten.
- Um an jede Zelle einen Tracer-Pfeil anzuzeigen, die direkt Daten an die aktive Zelle bereitstellt, klicken Sie auf Vorgänger verfolgen auf der Formelüberwachungs-Symbolleiste.
- Formeln verfolgen, die auf eine bestimmte Zelle verweisen (Abhängige)
- Wählen Sie die Zelle aus, für die Sie die abhängigen Zellen identifizieren möchten.
- Um einen Nachverfolgungspfeil für jede Zelle anzuzeigen, die von der aktiven Zelle abhängig ist, klicken Sie auf Abhängige nachverfolgen in der Formel-Überprüfungsleiste.
Vorgänger- und Abhängige Zellen verfolgen: Aspose.Cells
Vorgänger verfolgen
Aspose.Cells erleichtert das Abrufen von Vorgängerzellen. Es kann nicht nur Zellen abrufen, die Daten zu einfachen Formelvorgängern bereitstellen, sondern auch Zellen finden, die Daten zu komplexen Formelvorgängern mit benannten Bereichen bereitstellen.
Im folgenden Beispiel wird eine Vorlagen-Excel-Datei, Book1.xls, verwendet. Das Arbeitsblatt enthält Daten und Formeln.
Aspose.Cells stellt die Methode Cell.precedents() der Klasse Cell bereit, um die Vorgänger einer Zelle zu verfolgen. Sie gibt eine Sammlung referenzierter Bereiche zurück. Wie oben zu sehen ist, enthält die Datei Book1.xls in Zelle B7 die Formel “=SUM(A1:A3)”. Daher sind die Zellen A1:A3 die Vorgängerzellen von Zelle B7. Das folgende Beispiel demonstriert die Funktion zum Nachverfolgen von Vorgängern mithilfe der Vorlage Datei Book1.xls.
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example</title>
</head>
<body>
<h1>Get Cell Precedents Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample">Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
</body>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat } = AsposeCells;
AsposeCells.onReady({
license: "/lic/aspose.cells.enc",
fontPath: "/fonts/",
fontList: [
"arial.ttf",
"NotoSansSC-Regular.ttf"
]
}).then(() => {
console.log("Aspose.Cells initialized");
});
document.getElementById('runExample').addEventListener('click', async () => {
const fileInput = document.getElementById('fileInput');
if (!fileInput.files.length) {
document.getElementById('result').innerHTML = '<p style="color: red;">Please select an Excel file.</p>';
return;
}
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
// Instantiate workbook from uploaded file
const workbook = new Workbook(new Uint8Array(arrayBuffer));
// Access first worksheet's cells
const cells = workbook.worksheets.get(0).cells;
// Get cell B4
const cell = cells.get("B4");
if (cell) {
// Get precedents (converted from getPrecedents)
const ret = cell.precedents;
if (!ret.isNull() && ret.count > 0) {
const area = ret.get(0);
const sheetName = area.sheetName;
const startAddress = AsposeCells.CellsHelper.cellIndexToName(area.startRow, area.startColumn);
const endAddress = AsposeCells.CellsHelper.cellIndexToName(area.endRow, area.endColumn);
console.log(sheetName);
console.log(startAddress);
console.log(endAddress);
document.getElementById('result').innerHTML = `<pre>Sheet: ${sheetName}\nStart: ${startAddress}\nEnd: ${endAddress}</pre>`;
} else {
document.getElementById('result').innerHTML = '<p style="color: red;">No precedents found for the cell.</p>';
}
} else {
document.getElementById('result').innerHTML = '<p style="color: red;">Cell B4 is null.</p>';
}
});
</script>
</html>
Abhängige verfolgen
Aspose.Cells ermöglicht es, abhängige Zellen in Tabellenblättern zu erhalten. Aspose.Cells kann nicht nur Zellen abrufen, die Daten im Zusammenhang mit einer einfachen Formel liefern, sondern auch Zellen finden, die Daten zu komplexen Formeln mit benannten Bereichen liefern.
Aspose.Cells bietet die Methode Cell.dependents(boolean) der Klasse [Cell], um die Abhängigen einer Zelle zu verfolgen. Zum Beispiel gibt es in Book1.xlsx die Formeln “=A1+20” und “=A1+30” in den Zellen B2 bzw. C2. Das folgende Beispiel zeigt, wie man die Abhängigen der Zelle A1 mit der Vorlage Datei Book1.xlsx verfolgt.
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example</title>
</head>
<body>
<h1>Aspose.Cells - Get Cell Dependents Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample">Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
</body>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat, Worksheet, Cell } = AsposeCells;
AsposeCells.onReady({
license: "/lic/aspose.cells.enc",
fontPath: "/fonts/",
fontList: [
"arial.ttf",
"NotoSansSC-Regular.ttf"
]
}).then(() => {
console.log("Aspose.Cells initialized");
});
document.getElementById('runExample').addEventListener('click', async () => {
const fileInput = document.getElementById('fileInput');
const resultDiv = document.getElementById('result');
if (!fileInput.files.length) {
resultDiv.innerHTML = '<p style="color: red;">Please select an Excel file.</p>';
return;
}
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
// Loads the workbook which contains hidden external links
const workbook = new Workbook(new Uint8Array(arrayBuffer));
const cells = workbook.worksheets.get(0).cells;
const cell = cells.get("B2");
// Ensure dependents is accessed as a property (converted from getDependents)
const dependents = cell.dependents;
if (Array.isArray(dependents)) {
let out = '<p>Dependents found:</p><ul>';
for (const c of dependents) {
console.log(c.name);
out += `<li>${c.name}</li>`;
}
out += '</ul>';
resultDiv.innerHTML = out;
} else {
console.error("Dependents is not an array");
resultDiv.innerHTML = '<p style="color: red;">Dependents is not an array</p>';
}
});
</script>
</html>
Nachverfolgung von Vorgänger- und abhängigen Zellen gemäß der Berechnungskette
Die oben genannten APIs zum Nachverfolgen von Vorgängern und Abhängigen basieren auf der Formel selbst. Sie bieten eine bequeme Möglichkeit, die Abhängigkeiten für einige Formeln nachzuverfolgen. Wenn es jedoch viele Formeln im Arbeitsbuch gibt und der Benutzer Vorgänger und Abhängige für jede Zelle nachverfolgen muss, sind die Leistungen schlecht. Für solche Situationen sollten Benutzer die Methoden Cell.precedentsInCalculation() und Cell.dependentsInCalculation(boolean) verwenden. Diese beiden Methoden verfolgen Abhängigkeiten gemäß der Berechnungskette. Um sie zu verwenden, muss zuerst die Berechnungskette durch FormulaSettings.enableCalculationChain() aktiviert werden. Danach sollte eine vollständige Berechnung für die Arbeitsmappe mit Workbook.calculateFormula() durchgeführt werden. Danach können Vorgänger oder Abhängige für alle Zellen, die Sie benötigen, verfolgt werden.
Bei einigen Formeln können die resultierenden Vorgänger unterschiedlich sein, je nachdem ob man [predecessors] oder [predecessorsInCalculation] verwendet, und die resultierenden Abhängigen können bei [dependents] und [dependentsInCalculation] unterschiedlich sein. Zum Beispiel liefert die Formel in Zelle A1 “=IF(TRUE,B2,C3)” als Vorgänger die Zellen B2 und C3. Entsprechend haben B2 und C3 beide den Abhängigen A1, wenn man bei Abhängigen nachschaut. Für die Berechnung dieser Formel ist jedoch nur B2 entscheidend für das Ergebnis. Daher werden bei [predecessorsInCalculation] keine C3 gelistet, und bei [dependentsInCalculation] wird A1 nicht in C3 angezeigt. Manchmal müssen Nutzer nur die tatsächlichen Abhängigkeiten verfolgen, die beeinflussen, wie die Formel basierend auf den aktuellen Daten im Arbeitsbuch berechnet wird. In diesem Fall sollten sie [dependentsInCalculation/precedentsInCalculation] anstelle von [dependents/precedents] verwenden.
Das folgende Beispiel zeigt, wie man die Vorgänger und Abhängige anhand der Berechnungskette für Zellen verfolgt:
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example</title>
</head>
<body>
<h1>Aspose.Cells Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample">Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
</body>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat } = AsposeCells;
AsposeCells.onReady({
license: "/lic/aspose.cells.enc",
fontPath: "/fonts/",
fontList: [
"arial.ttf",
"NotoSansSC-Regular.ttf"
]
}).then(() => {
console.log("Aspose.Cells initialized");
});
document.getElementById('runExample').addEventListener('click', async () => {
const fileInput = document.getElementById('fileInput');
const resultDiv = document.getElementById('result');
resultDiv.innerHTML = '';
if (!fileInput.files.length) {
resultDiv.innerHTML = '<p style="color: red;">Please select an Excel file.</p>';
return;
}
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
// Instantiating a Workbook object by opening the uploaded file
const workbook = new Workbook(new Uint8Array(arrayBuffer));
// Accessing the first worksheet and its cells
const cells = workbook.worksheets.get(0).cells;
// Setting formulas
cells.get("A1").formula = "=B1+SUM(B1:B10)+[Book1.xls]Sheet1!B2";
cells.get("A2").formula = "=IF(TRUE,B2,B1)";
// Enable calculation chain
workbook.settings.formulaSettings.enableCalculationChain = true;
// Calculate formulas
workbook.calculateFormula();
// Collect output
let output = '';
let en = cells.get("B1").dependentsInCalculation;
output += "B1's calculation dependents:\n";
if (en && en.length !== undefined) {
for (var cell of en) {
output += (cell.name || '') + "\n";
}
} else if (en) {
// If it's an iterable but doesn't have length
for (var cell of en) {
output += (cell.name || '') + "\n";
}
}
output += "\n";
en = cells.get("B2").dependentsInCalculation;
output += "B2's calculation dependents:\n";
if (en && en.length !== undefined) {
for (var cell of en) {
output += (cell.name || '') + "\n";
}
} else if (en) {
for (var cell of en) {
output += (cell.name || '') + "\n";
}
}
output += "\n";
en = cells.get("A1").precedentsInCalculation;
output += "A1's calculation precedents:\n";
if (en && en.length !== undefined) {
for (var area of en) {
output += area.toString() + "\n";
}
} else if (en) {
for (var area of en) {
output += area.toString() + "\n";
}
}
output += "\n";
en = cells.get("A2").precedentsInCalculation;
output += "A2's calculation precedents:\n";
if (en && en.length !== undefined) {
for (var area of en) {
output += area.toString() + "\n";
}
} else if (en) {
for (var area of en) {
output += area.toString() + "\n";
}
}
resultDiv.innerHTML = '<pre>' + output.replace(/</g, '<') + '</pre>';
// Save the modified workbook and provide download link
const outputData = workbook.save(SaveFormat.Xlsx);
const blob = new Blob([outputData]);
const downloadLink = document.getElementById('downloadLink');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = 'output.xlsx';
downloadLink.style.display = 'block';
downloadLink.textContent = 'Download Modified Excel File';
});
</script>
</html>