Test in einer Live-Umgebung
Test in der Produktion ohne Wasserzeichen.
Funktioniert überall, wo Sie es brauchen.
Dieser Leitfaden untersucht, wie bestehende Word-Dokumente importiert, deren Inhalte angezeigt und Dokumente von Grund auf neu erstellt werden können mithilfe der IronWord-Bibliothek. Am Ende dieses Tutorials haben Sie einASP.NET CoreWebanwendung, die Folgendes kann:
Word-Dokumente hochladen und lesen
Zeigen Sie den Inhalt dieser Dokumente in einem Textfeld an.
Exportieren Sie die Docx-Datei
Dieses Projekt ist perfekt für Entwickler, die die Verarbeitung von Word-Dokumenten in ihre Webanwendungen integrieren müssen, sei es für Dokumentenmanagementsysteme, Berichtsgeneratoren oder andere Szenarien, die Microsoft Word-Dateien umfassen.
Um diesem Tutorial zu folgen, sollten Sie Folgendes haben:
.NET Core SDK 3.1 oder höher
Keine Sorge, wenn Sie kein Experte in diesen Technologien sind – wir führen Sie Schritt für Schritt durch den Prozess.!
IronWordist eine .NET-Bibliothek, die Entwicklern ermöglicht, Microsoft Word-Dokumente programmatisch zu lesen, zu manipulieren und zu erstellen. Es bietet eine High-Level-API, die die Arbeit mit Word-Dateien vereinfacht und es zu einer ausgezeichneten Wahl für unser Projekt macht.
Einige Hauptmerkmale von IronWord umfassen:
Die Umwandlung eines Word-Dokuments in ein PDF-Dokument ist einfach, sodass Sie Ihre endgültigen Word-Dokumente in leicht teilbare PDF-Dateien umwandeln können.
Da wir nun einen Überblick darüber haben, was wir bauen und welche Tools wir verwenden werden, lassen Sie uns mit der Einrichtung unseres Projekts beginnen.!
In diesem Abschnitt erstellen wir ein neues ASP.NET Core-Projekt und installieren die erforderlichen Pakete, um mit IronWord zu arbeiten.
Öffnen Sie Visual Studio 2019 oder später.
Klicken Sie auf "Ein neues Projekt erstellen".
Kaputtes Bild Von Pixabay hinzufügen, aus Ihren Dateien auswählen oder ein Bild hierher ziehen.
Klicken Sie auf "Weiter".
Nennen Sie Ihr Projekt „WordDocumentProcessor“(oder ein beliebiger Name Ihrer Wahl).
Da wir nun unser Projekt eingerichtet haben, lassen Sie uns die IronWord-Bibliothek hinzufügen:
Klicken Sie mit der rechten Maustaste auf Ihr Projekt im Projektmappen-Explorer.
Wählen Sie "NuGet-Pakete verwalten".
Kaputtes Bild Von Pixabay hinzufügen, aus Ihren Dateien auswählen oder ein Bild hierher ziehen.
Suchen Sie nach dem offiziellen IronWord-Paket.
Lassen Sie uns unsere bestehende Struktur aktualisieren, um die Dokumentverarbeitungsfunktionalität einzubinden:
Wir werden den bestehenden HomeController.cs im Controllers-Ordner für unsere Dokumentenverarbeitung verwenden.
Wir werden die bestehende Index.cshtml-Ansicht im Ordner Views/Home aktualisieren, um die Dokument-Upload- und Anzeige-Funktionalität einzuschließen.
Jetzt, da wir unser Projekt eingerichtet und das IronWord-Paket installiert haben, sind wir bereit, die Import- und Exportfunktionalität für Dokumente zu implementieren. Wir werden neue Methoden zu unserem HomeController hinzufügen und die Index-Ansicht anpassen, um diese Funktionen zu unterstützen. Im nächsten Abschnitt konzentrieren wir uns auf das Importieren von Word-Dokumenten und das Anzeigen ihres Inhalts, unter Nutzung unserer bestehenden Controller- und View-Struktur. Wir können auch eine Serienbrieffunktion hinzufügen, aber in diesem Artikel konzentrieren wir uns auf das Importieren und Exportieren von Dokumenten.
In diesem Abschnitt werden wir untersuchen, wie eine Funktion zum Importieren und Verarbeiten von Word-Dokumenten in einer ASP.NET MVC-Anwendung implementiert werden kann. Wir werden sowohl das Design der Benutzeroberfläche als auch die Logik des Back-End-Controllers behandeln.
Die Benutzeroberfläche zum Importieren von Word-Dokumenten ist benutzerfreundlich und optisch ansprechend gestaltet. Lassen Sie uns die Hauptkomponenten der Benutzeroberfläche aufschlüsseln:
Der Upload-Bereich ist der zentrale Punkt der Benutzeroberfläche und lädt Benutzer dazu ein, ihre Word-Dokumente auszuwählen und hochzuladen. Hier ist die Struktur:
<div class="upload-area">
<svg class="file-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
<polyline points="14 2 14 8 20 8"></polyline>
<line x1="16" y1="13" x2="8" y2="13"></line>
<line x1="16" y1="17" x2="8" y2="17"></line>
<polyline points="10 9 9 9 8 9"></polyline>
</svg>
<p>Choose a Word document</p>
<label for="fileInput" class="choose-file">Choose File</label>
<p class="file-info">.DOC or .DOCX (MAX. 10MB)</p>
<button id="uploadBtn" class="upload-button">Upload and Process</button>
</div>
<div class="upload-area">
<svg class="file-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
<polyline points="14 2 14 8 20 8"></polyline>
<line x1="16" y1="13" x2="8" y2="13"></line>
<line x1="16" y1="17" x2="8" y2="17"></line>
<polyline points="10 9 9 9 8 9"></polyline>
</svg>
<p>Choose a Word document</p>
<label for="fileInput" class="choose-file">Choose File</label>
<p class="file-info">.DOC or .DOCX (MAX. 10MB)</p>
<button id="uploadBtn" class="upload-button">Upload and Process</button>
</div>
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'<div class="upload-area"> <svg class="file-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> <polyline points="14 2 14 8 20 8"></polyline> <line x1="16" y1="13" x2="8" y2="13"></line> <line x1="16" y1="17" x2="8" y2="17"></line> <polyline points="10 9 9 9 8 9"></polyline> </svg> <p> Choose a Word document</p> <label for="fileInput" class="choose-file"> Choose File</label> <p class="file-info">.DOC @or.DOCX(MAX. 10MB)</p> <button id="uploadBtn" class="upload-button"> Upload @and Process</button> </div>
Dieser Code erstellt einen optisch ansprechenden Upload-Bereich mit einem Dateisymbol, einem versteckten Dateieingabefeld und einem gestalteten Label, das als Dateiauswahlknopf dient. Es enthält auch Informationen über akzeptierte Dateitypen und einen Button, um den Upload und die Verarbeitung zu starten.
Nach der Verarbeitung des Dokuments wird dessen Inhalt in einem speziellen Bereich angezeigt:
<div class="content-wrapper">
<h2>Document Content:</h2>
<div id="documentContent" class="content-area">
No content to display.
</div>
</div>
<div class="content-wrapper">
<h2>Document Content:</h2>
<div id="documentContent" class="content-area">
No content to display.
</div>
</div>
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'<div class="content-wrapper"> <h2> Document Content:</h2> <div id="documentContent" class="content-area"> No content @to display. </div> </div>
Dieser Abschnitt bietet einen scrollbaren Bereich zur Anzeige des bearbeiteten Dokumentinhalts.
Der HomeController übernimmt die serverseitige Logik für das Importieren und Verarbeiten von Word-Dokumenten. Lassen Sie uns die wichtigsten Methoden untersuchen:
Diese Methode ist verantwortlich für das Hochladen und Verarbeiten von Dateien:
[HttpPost]
public IActionResult UploadAndProcess(IFormFile file)
{
if (file == null
file.Length == 0)
{
return Json(new { success = false, message = "No file uploaded." });
}
var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (fileExtension != ".doc" && fileExtension != ".docx")
{
return Json(new { success = false, message = "Invalid file type. Please upload a .doc or .docx file." });
}
try
{
var tempFilePath = Path.GetTempFileName();
using (var stream = new FileStream(tempFilePath, FileMode.Create))
{
file.CopyTo(stream);
}
StringBuilder contentBuilder = new StringBuilder();
WordDocument doc = new WordDocument(tempFilePath);
foreach (Paragraph paragraph in doc.Paragraphs)
{
foreach (Text textRun in paragraph.Texts)
{
contentBuilder.AppendLine(textRun.Text);
}
contentBuilder.AppendLine(); // Add an extra line between paragraphs
}
System.IO.File.Delete(tempFilePath); // Clean up the temporary file
return Json(new { success = true, content = FormatContentAsHtml(contentBuilder.ToString()) });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing document");
return Json(new { success = false, message = "An error occurred while processing the document." });
}
}
[HttpPost]
public IActionResult UploadAndProcess(IFormFile file)
{
if (file == null
file.Length == 0)
{
return Json(new { success = false, message = "No file uploaded." });
}
var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (fileExtension != ".doc" && fileExtension != ".docx")
{
return Json(new { success = false, message = "Invalid file type. Please upload a .doc or .docx file." });
}
try
{
var tempFilePath = Path.GetTempFileName();
using (var stream = new FileStream(tempFilePath, FileMode.Create))
{
file.CopyTo(stream);
}
StringBuilder contentBuilder = new StringBuilder();
WordDocument doc = new WordDocument(tempFilePath);
foreach (Paragraph paragraph in doc.Paragraphs)
{
foreach (Text textRun in paragraph.Texts)
{
contentBuilder.AppendLine(textRun.Text);
}
contentBuilder.AppendLine(); // Add an extra line between paragraphs
}
System.IO.File.Delete(tempFilePath); // Clean up the temporary file
return Json(new { success = true, content = FormatContentAsHtml(contentBuilder.ToString()) });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing document");
return Json(new { success = false, message = "An error occurred while processing the document." });
}
}
<HttpPost>
Public Function UploadAndProcess(ByVal file As IFormFile) As IActionResult
If file Is Nothing file.Length = 0 Then
Return Json(New With {
Key .success = False,
Key .message = "No file uploaded."
})
End If
Dim fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant()
If fileExtension <> ".doc" AndAlso fileExtension <> ".docx" Then
Return Json(New With {
Key .success = False,
Key .message = "Invalid file type. Please upload a .doc or .docx file."
})
End If
Try
Dim tempFilePath = Path.GetTempFileName()
Using stream = New FileStream(tempFilePath, FileMode.Create)
file.CopyTo(stream)
End Using
Dim contentBuilder As New StringBuilder()
Dim doc As New WordDocument(tempFilePath)
For Each paragraph As Paragraph In doc.Paragraphs
For Each textRun As Text In paragraph.Texts
contentBuilder.AppendLine(textRun.Text)
Next textRun
contentBuilder.AppendLine() ' Add an extra line between paragraphs
Next paragraph
System.IO.File.Delete(tempFilePath) ' Clean up the temporary file
Return Json(New With {
Key .success = True,
Key .content = FormatContentAsHtml(contentBuilder.ToString())
})
Catch ex As Exception
_logger.LogError(ex, "Error processing document")
Return Json(New With {
Key .success = False,
Key .message = "An error occurred while processing the document."
})
End Try
End Function
Diese Methode führt die folgenden Aufgaben aus:
Validiert die hochgeladene Datei und stellt sicher, dass sie im richtigen Dateiformat vorliegt.(DOC oder DOCX)
Überprüft die korrekte Dateierweiterung
Verarbeitet das Dokument mit der IronWord-Bibliothek
Diese private Methode formatiert den extrahierten Inhalt in HTML:
private string FormatContentAsHtml(string content)
{
var lines = content.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<div class='document-content'>");
foreach (var line in lines)
{
if (string.IsNullOrWhiteSpace(line))
{
htmlBuilder.Append("<p> </p>");
}
else
{
htmlBuilder.Append($"<p>{HttpUtility.HtmlEncode(line)}</p>");
}
}
htmlBuilder.Append("</div>");
return htmlBuilder.ToString();
}
private string FormatContentAsHtml(string content)
{
var lines = content.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<div class='document-content'>");
foreach (var line in lines)
{
if (string.IsNullOrWhiteSpace(line))
{
htmlBuilder.Append("<p> </p>");
}
else
{
htmlBuilder.Append($"<p>{HttpUtility.HtmlEncode(line)}</p>");
}
}
htmlBuilder.Append("</div>");
return htmlBuilder.ToString();
}
Private Function FormatContentAsHtml(ByVal content As String) As String
Dim lines = content.Split( { Environment.NewLine }, StringSplitOptions.None)
Dim htmlBuilder = New StringBuilder()
htmlBuilder.Append("<div class='document-content'>")
For Each line In lines
If String.IsNullOrWhiteSpace(line) Then
htmlBuilder.Append("<p> </p>")
Else
htmlBuilder.Append($"<p>{HttpUtility.HtmlEncode(line)}</p>")
End If
Next line
htmlBuilder.Append("</div>")
Return htmlBuilder.ToString()
End Function
Diese Methode stellt sicher, dass der Dokumentinhalt korrekt als HTML formatiert wird, wobei jede Zeile in Paragraph-Tags eingeschlossen ist und leere Zeilen erhalten bleiben.
Um den Datei-Upload zu bearbeiten und den verarbeiteten Inhalt anzuzeigen, verwenden wir JavaScript:
uploadBtn.addEventListener('click', () => {
const file = fileInput.files[0];
if (!file) {
alert('Please select a file first.');
return;
}
const formData = new FormData();
formData.append('file', file);
uploadBtn.disabled = true;
uploadBtn.textContent = 'Processing...';
documentContent.innerHTML = 'Processing document...';
fetch('/Home/UploadAndProcess', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
documentContent.innerHTML = data.content;
} else {
documentContent.innerHTML = `<p>Error: ${data.message}</p>`;
}
})
.catch(error => {
console.error('Error:', error);
documentContent.innerHTML = '<p>An error occurred while processing the document.</p>';
})
.finally(() => {
uploadBtn.disabled = false;
uploadBtn.textContent = 'Upload and Process';
});
});
uploadBtn.addEventListener('click', () => {
const file = fileInput.files[0];
if (!file) {
alert('Please select a file first.');
return;
}
const formData = new FormData();
formData.append('file', file);
uploadBtn.disabled = true;
uploadBtn.textContent = 'Processing...';
documentContent.innerHTML = 'Processing document...';
fetch('/Home/UploadAndProcess', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
documentContent.innerHTML = data.content;
} else {
documentContent.innerHTML = `<p>Error: ${data.message}</p>`;
}
})
.catch(error => {
console.error('Error:', error);
documentContent.innerHTML = '<p>An error occurred while processing the document.</p>';
})
.finally(() => {
uploadBtn.disabled = false;
uploadBtn.textContent = 'Upload and Process';
});
});
uploadBtn.addEventListener( 'click', () =>
If True Then
const file = fileInput.files(0)
If Not file Then
alert( 'Please select a file first.');
Return
End If
const formData = New FormData()
formData.append( 'file', file);
uploadBtn.disabled = True
'INSTANT VB TODO TASK: The following line uses invalid syntax:
' uploadBtn.textContent = 'Processing...'; documentContent.innerHTML = 'Processing document...'; fetch('/Home/UploadAndProcess', { method: 'POST', body: formData }).@then(response => response.json()).@then(data => { if(data.success) { documentContent.innerHTML = data.content; } else { documentContent.innerHTML = `<p> @Error: ${data.message}</p>`; } }).catch(@error => { console.@error('@Error:', @error); documentContent.innerHTML = '<p> An @error occurred while processing the document.</p>'; }).finally(() => { uploadBtn.disabled = False; uploadBtn.textContent = 'Upload @and Process'; }); });
Dieser JavaScript-Code verarbeitet den Datei-Upload, sendet die Datei zur Verarbeitung an den Server und aktualisiert die Benutzeroberfläche mit dem verarbeiteten Inhalt oder Fehlermeldungen.
Die Anwendung verwendet benutzerdefiniertes CSS, um eine attraktive und benutzerfreundliche Oberfläche zu erstellen.
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f7f7f7;
color: #333;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 2rem;
padding-top: 0.5rem;
}
h1 {
font-weight: 300;
color: #2c3e50;
text-align: center;
margin-bottom: 1rem;
}
.lead {
text-align: center;
color: #7f8c8d;
margin-bottom: 2rem;
}
.upload-area {
background-color: #ffffff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
padding: 2rem;
text-align: center;
margin-bottom: 2rem;
transition: all 0.3s ease;
}
.upload-area:hover {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.file-icon {
width: 64px;
height: 64px;
margin-bottom: 1rem;
color: #3498db;
}
.choose-file {
background-color: #ecf0f1;
color: #2c3e50;
border: none;
padding: 0.5rem 1rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.choose-file:hover {
background-color: #d5dbdb;
}
.file-info {
font-size: 0.9em;
color: #95a5a6;
margin-top: 0.5rem;
}
.upload-button {
background-color: #3498db;
color: white;
border: none;
padding: 0.75rem 1.5rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
margin-top: 1rem;
}
.upload-button:hover {
background-color: #2980b9;
}
.content-wrapper {
background-color: #ffffff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
padding: 1rem;
margin-top: 2rem;
}
.content-area {
max-height: 300px;
overflow-y: auto;
padding: 1rem;
background-color: #f9f9f9;
border-radius: 4px;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
font-size: 14px;
line-height: 1.6;
}
.content-area::-webkit-scrollbar {
width: 8px;
}
.content-area::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
.content-area::-webkit-scrollbar-thumb {
background: #bdc3c7;
border-radius: 4px;
}
.content-area::-webkit-scrollbar-thumb:hover {
background: #95a5a6;
}
.document-content p {
margin: 0 0 10px 0;
}
</style>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f7f7f7;
color: #333;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 2rem;
padding-top: 0.5rem;
}
h1 {
font-weight: 300;
color: #2c3e50;
text-align: center;
margin-bottom: 1rem;
}
.lead {
text-align: center;
color: #7f8c8d;
margin-bottom: 2rem;
}
.upload-area {
background-color: #ffffff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
padding: 2rem;
text-align: center;
margin-bottom: 2rem;
transition: all 0.3s ease;
}
.upload-area:hover {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.file-icon {
width: 64px;
height: 64px;
margin-bottom: 1rem;
color: #3498db;
}
.choose-file {
background-color: #ecf0f1;
color: #2c3e50;
border: none;
padding: 0.5rem 1rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.choose-file:hover {
background-color: #d5dbdb;
}
.file-info {
font-size: 0.9em;
color: #95a5a6;
margin-top: 0.5rem;
}
.upload-button {
background-color: #3498db;
color: white;
border: none;
padding: 0.75rem 1.5rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
margin-top: 1rem;
}
.upload-button:hover {
background-color: #2980b9;
}
.content-wrapper {
background-color: #ffffff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
padding: 1rem;
margin-top: 2rem;
}
.content-area {
max-height: 300px;
overflow-y: auto;
padding: 1rem;
background-color: #f9f9f9;
border-radius: 4px;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
font-size: 14px;
line-height: 1.6;
}
.content-area::-webkit-scrollbar {
width: 8px;
}
.content-area::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
.content-area::-webkit-scrollbar-thumb {
background: #bdc3c7;
border-radius: 4px;
}
.content-area::-webkit-scrollbar-thumb:hover {
background: #95a5a6;
}
.document-content p {
margin: 0 0 10px 0;
}
</style>
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'(Of style) body
'{
''INSTANT VB TODO TASK: The following line uses invalid syntax:
'' font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f7f7f7; color: #333; } .container { max-width: 800px; margin: 0 auto; padding: 2rem; padding-top: 0.5rem; } h1 { font-weight: 300; color: #2c3e50; text-align: center; margin-bottom: 1rem; } .lead { text-align: center; color: #7f8c8d; margin-bottom: 2rem; } .upload-area { background-color: #ffffff; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); padding: 2rem; text-align: center; margin-bottom: 2rem; transition: all 0.3s ease; } .upload-area:hover { box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); } .file-icon { width: 64px; height: 64px; margin-bottom: 1rem; color: #3498db; } .choose-file { background-color: #ecf0f1; color: #2c3e50; border: none; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer; transition: background-color 0.3s ease; } .choose-file:hover { background-color: #d5dbdb; } .file-info { font-size: 0.9em; color: #95a5a6; margin-top: 0.5rem; } .upload-button { background-color: #3498db; color: white; border: none; padding: 0.75rem 1.5rem; border-radius: 4px; cursor: pointer; transition: background-color 0.3s ease; margin-top: 1rem; } .upload-button:hover { background-color: #2980b9; } .content-wrapper { background-color: #ffffff; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); padding: 1rem; margin-top: 2rem; } .content-area { max-height: 300px; overflow-y: auto; padding: 1rem; background-color: #f9f9f9; border-radius: 4px; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-size: 14px; line-height: 1.6; } .content-area::-webkit-scrollbar { width: 8px; } .content-area::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; } .content-area::-webkit-scrollbar-thumb { background: #bdc3c7; border-radius: 4px; } .content-area::-webkit-scrollbar-thumb:hover { background: #95a5a6; } .document-content p { margin: 0 0 10px 0; } </style>
Dieses CSS erzeugt einen sauberen, modernen Look mit einem hellen Farbschema. Der Upload-Bereich verfügt über einen weißen Hintergrund mit subtilen Schatteneffekten, während der Inhaltsbereich ein scrollbares Design mit einem hellgrauen Hintergrund aufweist. Die Verwendung der Eigenschaften border-radius und box-shadow verleiht den Schnittstellenelementen Tiefe und visuelles Interesse.
Während wir unseren Word Document Processor weiter verbessern, lassen Sie uns die Fähigkeit zum Exportieren von Dokumenten hinzufügen. Diese Funktion ermöglicht es den Benutzern, ein neues Word-Dokument aus unserer Anwendung zu erstellen.
Zuerst fügen wir unserer Navigationsleiste eine "Exportieren"-Option hinzu. Öffnen Sie die Datei _Layout.cshtml im Ordner Views/Shared und suchen Sie die
element. Fügen wir einen neuen Listeneintrag für unsere Exportfunktion hinzu:<li class="nav-item">
<a class="nav-link" id="exportLink" href="#" onclick="exportDocument(); return false;"><i class="fas fa-file-export"></i> Export</a>
</li>
<li class="nav-item">
<a class="nav-link" id="exportLink" href="#" onclick="exportDocument(); return false;"><i class="fas fa-file-export"></i> Export</a>
</li>
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'<li class="nav-item"> <a class="nav-link" id="exportLink" href="#" onclick="exportDocument(); return false;"><i class="fas fa-file-export"></i> Export</a> </li>
Wir verwenden Font Awesome für das Symbol. Stellen Sie also sicher, dass wir den CSS-Link in unserem ... haben.
Abschnitt. Dieser Code fügt der Navigationsleiste einen "Exportieren"-Link hinzu. Es verwendet Font Awesome für das Symbol und ruft die exportDocument-Funktion auf.() Funktion beim Klicken. Das href="#"** und return false verhindern das Standardverhalten des Links.Fügen wir nun die JavaScript-Funktion hinzu, die den Exportvorgang übernimmt. At the bottom of our _Layout.cshtml file, just before the closing
tag, we'll add the following script:
<script>
function exportDocument() {
$.ajax({
url: '/Home/ExportWordDocument',
type: 'POST',
success: function (response) {
if (response.success) {
var fileName = prompt("Enter a name for the document (without extension):", "ExportedDocument");
if (fileName === null) {
return;
}
fileName = (fileName.trim()
"ExportedDocument").replace(/\.[^/.]+$/, "") + ".docx";
var a = document.createElement('a');
a.style.display = 'none';
a.href = '/Home/DownloadFile?tempFilePath=' + encodeURIComponent(response.tempFilePath) + '&userFileName=' + encodeURIComponent(fileName);
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
} else {
alert('Failed to export document: ' + response.message);
}
},
error: function () {
alert('An error occurred while exporting the document.');
}
});
}
</script>
<script>
function exportDocument() {
$.ajax({
url: '/Home/ExportWordDocument',
type: 'POST',
success: function (response) {
if (response.success) {
var fileName = prompt("Enter a name for the document (without extension):", "ExportedDocument");
if (fileName === null) {
return;
}
fileName = (fileName.trim()
"ExportedDocument").replace(/\.[^/.]+$/, "") + ".docx";
var a = document.createElement('a');
a.style.display = 'none';
a.href = '/Home/DownloadFile?tempFilePath=' + encodeURIComponent(response.tempFilePath) + '&userFileName=' + encodeURIComponent(fileName);
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
} else {
alert('Failed to export document: ' + response.message);
}
},
error: function () {
alert('An error occurred while exporting the document.');
}
});
}
</script>
Private Function exportDocument() As [function](Of script)
$.ajax({ url: '/Home/ExportWordDocument', type: 'POST', success: @function(response) { if(response.success) { var fileName = prompt("Enter a name for the document (without extension):", "ExportedDocument"); if(fileName === Nothing) { Return; } fileName = (fileName.trim() "ExportedDocument").replace(/\.[^/.]+$/, "") + ".docx"; var a = document.createElement("a"c); a.style.display = 'none'; a.href = '/Home/System.Nullable<DownloadFile>tempFilePath=' + encodeURIComponent(response.tempFilePath) + '&userFileName=' + encodeURIComponent(fileName); document.body.appendChild(a); a.click(); document.body.removeChild(a); } else { alert('Failed @to export document: ' + response.message); } }, @error: @function() { alert('An @error occurred while exporting the document.'); } });
End Function
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'</script>
Diese JavaScript-Funktion sendet eine AJAX-POST-Anfrage an den Server, um ein Word-Dokument zu erstellen. Bei Erfolg wird der Benutzer nach einem Dateinamen gefragt und es wird ein temporärer Link zum Herunterladen der Datei erstellt. Der Link wird automatisch geklickt und anschließend aus dem DOM entfernt. Wenn in irgendeiner Phase ein Fehler auftritt, wird dem Benutzer eine Warnung angezeigt.
Nun, lassen Sie uns die serverseitige Logik implementieren. Öffnen Sie die Datei HomeController.cs im Ordner Controllers. Wir werden zwei neue Methoden hinzufügen, um den Exportprozess zu bearbeiten.
Zuerst fügen wir die Methode hinzu, um das Word-Dokument zu erstellen:
[HttpPost]
public IActionResult ExportWordDocument()
{
try
{
WordDocument doc = new WordDocument();
doc.AddText("Test Word");
string tempFileName = $"TempDoc_{Guid.NewGuid()}.docx";
string tempFilePath = Path.Combine(_environment.WebRootPath, "TempFiles", tempFileName);
Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath));
doc.SaveAs(tempFilePath);
return Json(new { success = true, tempFilePath = $"/TempFiles/{tempFileName}" });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error exporting Word document");
return Json(new { success = false, message = "An error occurred while exporting the document." });
}
}
[HttpPost]
public IActionResult ExportWordDocument()
{
try
{
WordDocument doc = new WordDocument();
doc.AddText("Test Word");
string tempFileName = $"TempDoc_{Guid.NewGuid()}.docx";
string tempFilePath = Path.Combine(_environment.WebRootPath, "TempFiles", tempFileName);
Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath));
doc.SaveAs(tempFilePath);
return Json(new { success = true, tempFilePath = $"/TempFiles/{tempFileName}" });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error exporting Word document");
return Json(new { success = false, message = "An error occurred while exporting the document." });
}
}
<HttpPost>
Public Function ExportWordDocument() As IActionResult
Try
Dim doc As New WordDocument()
doc.AddText("Test Word")
Dim tempFileName As String = $"TempDoc_{Guid.NewGuid()}.docx"
Dim tempFilePath As String = Path.Combine(_environment.WebRootPath, "TempFiles", tempFileName)
Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath))
doc.SaveAs(tempFilePath)
Return Json(New With {
Key .success = True,
Key .tempFilePath = $"/TempFiles/{tempFileName}"
})
Catch ex As Exception
_logger.LogError(ex, "Error exporting Word document")
Return Json(New With {
Key .success = False,
Key .message = "An error occurred while exporting the document."
})
End Try
End Function
Diese Methode erstellt ein neues Word-Dokument mit der IronWord-Bibliothek, fügt einen Testtext hinzu und speichert es in einer temporären Datei mit einem eindeutigen Namen. Es gibt ein JSON-Objekt zurück, das den Erfolgsstatus und den Pfad zur temporären Datei enthält. Wenn ein Fehler auftritt, wird die Ausnahme protokolliert und eine Fehlermeldung zurückgegeben.
Als Nächstes fügen wir die Methode hinzu, um den Dateidownload zu verarbeiten:
[HttpGet]
public IActionResult DownloadFile(string tempFilePath, string userFileName)
{
try
{
string fullPath = Path.Combine(_environment.WebRootPath, tempFilePath.TrimStart('/'));
if (!System.IO.File.Exists(fullPath))
{
return NotFound();
}
byte[] fileBytes = System.IO.File.ReadAllBytes(fullPath);
System.IO.File.Delete(fullPath);
string fileName = !string.IsNullOrEmpty(userFileName) ? userFileName : "ExportedDocument.docx";
return File(fileBytes, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fileName);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error downloading file");
return BadRequest("An error occurred while downloading the file.");
}
}
[HttpGet]
public IActionResult DownloadFile(string tempFilePath, string userFileName)
{
try
{
string fullPath = Path.Combine(_environment.WebRootPath, tempFilePath.TrimStart('/'));
if (!System.IO.File.Exists(fullPath))
{
return NotFound();
}
byte[] fileBytes = System.IO.File.ReadAllBytes(fullPath);
System.IO.File.Delete(fullPath);
string fileName = !string.IsNullOrEmpty(userFileName) ? userFileName : "ExportedDocument.docx";
return File(fileBytes, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fileName);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error downloading file");
return BadRequest("An error occurred while downloading the file.");
}
}
<HttpGet>
Public Function DownloadFile(ByVal tempFilePath As String, ByVal userFileName As String) As IActionResult
Try
Dim fullPath As String = Path.Combine(_environment.WebRootPath, tempFilePath.TrimStart("/"c))
If Not System.IO.File.Exists(fullPath) Then
Return NotFound()
End If
Dim fileBytes() As Byte = System.IO.File.ReadAllBytes(fullPath)
System.IO.File.Delete(fullPath)
Dim fileName As String = If(Not String.IsNullOrEmpty(userFileName), userFileName, "ExportedDocument.docx")
Return File(fileBytes, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fileName)
Catch ex As Exception
_logger.LogError(ex, "Error downloading file")
Return BadRequest("An error occurred while downloading the file.")
End Try
End Function
Diese Methode ruft die von ExportWordDocument erstellte temporäre Datei ab, liest deren Inhalt in ein Byte-Array ein und löscht anschließend die temporäre Datei. Sie verwendet den angegebenen Benutzernamen oder einen Standardnamen, falls keiner angegeben ist. Die Methode gibt dann den Dateiinhalte als herunterladbares Word-Dokument zurück. Wenn die Datei nicht gefunden wird oder ein Fehler auftritt, werden entsprechende HTTP-Antworten zurückgegeben.
Um das allgemeine Erscheinungsbild unseres Word-Dokumentverarbeitungsprogramms zu verbessern, haben wir benutzerdefiniertes CSS direkt in der _Layout.cshtml-Datei hinzugefügt. Lassen Sie uns das Styling untersuchen, das wir implementiert haben:
<style>
:root {
--primary-color: #3498db;
--text-color: #333;
--bg-color: #f8f9fa;
--nav-bg: #fff;
--nav-text: #2c3e50;
--nav-hover: #3498db;
}
body {
font-family: 'Segoe UI', sans-serif;
background-color: var(--bg-color);
color: var(--text-color);
line-height: 1.6;
}
.navbar { background-color: var(--nav-bg); }
.navbar-brand {
font-size: 1.5rem;
font-weight: 700;
color: var(--primary-color);
margin-right: 2rem;
}
.navbar-nav { margin-left: auto; }
.navbar-nav .nav-item { margin-left: 1rem; }
.navbar-nav .nav-link {
color: var(--nav-text);
font-weight: 500;
transition: all 0.3s ease;
padding: 0.5rem 1rem;
border-radius: 4px;
}
.navbar-nav .nav-link:hover, .navbar-nav .nav-link.active {
color: var(--primary-color);
background-color: rgba(52, 152, 219, 0.1);
}
.navbar-nav .nav-link i {
margin-right: 0.5rem;
font-size: 1.1em;
}
.centered-container {
max-width: 800px;
margin: 0 auto;
padding: 2rem;
}
.footer {
background-color: var(--nav-bg);
border-top: 1px solid #ecf0f1;
font-size: 0.9em;
color: var(--nav-text);
}
.footer a {
color: var(--primary-color);
text-decoration: none;
transition: color 0.3s ease;
}
.footer a:hover { color: var(--nav-hover); }
@@media (max-width: 576px) {
.navbar-nav {
margin-left: 0;
margin-top: 1rem;
}
.navbar-nav .nav-item {
margin-left: 0;
margin-bottom: 0.5rem;
}
}
</style>
<style>
:root {
--primary-color: #3498db;
--text-color: #333;
--bg-color: #f8f9fa;
--nav-bg: #fff;
--nav-text: #2c3e50;
--nav-hover: #3498db;
}
body {
font-family: 'Segoe UI', sans-serif;
background-color: var(--bg-color);
color: var(--text-color);
line-height: 1.6;
}
.navbar { background-color: var(--nav-bg); }
.navbar-brand {
font-size: 1.5rem;
font-weight: 700;
color: var(--primary-color);
margin-right: 2rem;
}
.navbar-nav { margin-left: auto; }
.navbar-nav .nav-item { margin-left: 1rem; }
.navbar-nav .nav-link {
color: var(--nav-text);
font-weight: 500;
transition: all 0.3s ease;
padding: 0.5rem 1rem;
border-radius: 4px;
}
.navbar-nav .nav-link:hover, .navbar-nav .nav-link.active {
color: var(--primary-color);
background-color: rgba(52, 152, 219, 0.1);
}
.navbar-nav .nav-link i {
margin-right: 0.5rem;
font-size: 1.1em;
}
.centered-container {
max-width: 800px;
margin: 0 auto;
padding: 2rem;
}
.footer {
background-color: var(--nav-bg);
border-top: 1px solid #ecf0f1;
font-size: 0.9em;
color: var(--nav-text);
}
.footer a {
color: var(--primary-color);
text-decoration: none;
transition: color 0.3s ease;
}
.footer a:hover { color: var(--nav-hover); }
@@media (max-width: 576px) {
.navbar-nav {
margin-left: 0;
margin-top: 1rem;
}
.navbar-nav .nav-item {
margin-left: 0;
margin-bottom: 0.5rem;
}
}
</style>
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'(Of style) :root
'{
' --primary-color: #3498db;
' --text-color: #333;
' --bg-color: #f8f9fa;
' --nav-bg: #fff;
' --nav-text: #2c3e50;
' --nav-hover: #3498db;
' }
body
If True Then
'INSTANT VB TODO TASK: The following line uses invalid syntax:
' font-family: 'Segoe UI', sans-serif; background-color: var(--bg-color); color: var(--text-color); line-height: 1.6; } .navbar { background-color: var(--nav-bg); } .navbar-brand { font-size: 1.5rem; font-weight: 700; color: var(--primary-color); margin-right: 2rem; } .navbar-nav { margin-left: auto; } .navbar-nav.nav-item { margin-left: 1rem; } .navbar-nav.nav-link { color: var(--nav-text); font-weight: 500; transition: all 0.3s ease; padding: 0.5rem 1rem; border-radius: 4px; } .navbar-nav.nav-link:hover, .navbar-nav.nav-link.active { color: var(--primary-color); background-color: rgba(52, 152, 219, 0.1); } .navbar-nav.nav-link i { margin-right: 0.5rem; font-size: 1.1em; } .centered-container { max-width: 800px; margin: 0 auto; padding: 2rem; } .footer { background-color: var(--nav-bg); border-top: 1px solid #ecf0f1; font-size: 0.9em; color: var(--nav-text); } .footer a { color: var(--primary-color); text-decoration: none; transition: color 0.3s ease; } .footer a:hover { color: var(--nav-hover); } @@media(max-width: 576px) { .navbar-nav { margin-left: 0; margin-top: 1rem; } .navbar-nav.nav-item { margin-left: 0; margin-bottom: 0.5rem; } } </style>
Dieser CSS-Block definiert das Farbschema und Layout unserer Anwendung. Wir verwenden CSS-Variablen(Benutzerdefinierte Eigenschaften)um eine konsistente Farbpalette in der gesamten App zu erstellen. Die Stile richten sich auf verschiedene Elemente, einschließlich des Körpers, der Navigationsleiste und der Fußzeile, um ein einheitliches Design zu gewährleisten. Wir haben die Navigationsleiste mit einem sauberen, modernen Erscheinungsbild eingerichtet, das Hover-Effekte und Symbolintegration bietet. W
Während sich unsere Anwendung derzeit auf Word-Dokumente konzentriert, können wir verwendenIronPDFum Unterstützung für PDF-Dokumente zu integrieren, um seine Funktionalität auf eine breitere Palette von Dateitypen zu erweitern. Das System könnte erweitert werden, um es Benutzern zu ermöglichen, ihre Dokumente zusätzlich zu den aktuellen Word-Formatoptionen als PDF-Datei zu exportieren.
Lassen Sie uns mit dem Ausführen unserer WordDocumentProcessor-Anwendung beginnen. Wie wir im Bild sehen können, wurde die Anwendung erfolgreich im Browser geladen. Die Benutzeroberfläche ist übersichtlich und benutzerfreundlich, mit einer Navigationsleiste oben, die die Optionen "Home" und "Export" anzeigt. Der Hauptinhaltbereich zeigt den Titel "Word Document Processor" und eine kurze Beschreibung: "Laden Sie Ihre Word-Dokumente problemlos hoch und verarbeiten Sie sie."
Jetzt versuchen wir, ein Dokument zu importieren. Auf dem Bild sehen wir, dass wir eine Datei namens "Honey research synopsis.docx" ausgewählt haben. Der Dateiname wird im Upload-Bereich angezeigt und ersetzt den Button „Datei auswählen“. Wir sind jetzt bereit, dieses Dokument hochzuladen und zu verarbeiten.
Nach dem Klicken auf "Hochladen und Verarbeiten" verarbeitet die Anwendung das Dokument und zeigt dessen Inhalt an. Der Abschnitt "Dokumentinhalt" zeigt nun den Anfang des hochgeladenen Dokuments an. Wir sehen den Titel "Beekeeping Technologies and Quality of Honey Production in Urban Areas", gefolgt von einer Zusammenfassung. Dies zeigt, dass unsere Anwendung den Inhalt des Word-Dokuments erfolgreich gelesen und angezeigt hat.
Zum Schluss testen wir die Exportfunktionalität. Auf dem Bild sehen wir eine Eingabeaufforderung, die erscheint, wenn wir auf die Schaltfläche "Exportieren" in der Navigationsleiste klicken. Die Aufforderung bittet uns, "einen Namen für das Dokument einzugeben."(ohne Erweiterung)". Der Standardname "ExportedDocument" ist vorausgefüllt, aber wir können ihn bei Bedarf ändern. Diese Eingabeaufforderung ermöglicht es uns, den Namen unseres exportierten Dokuments vor dem Herunterladen anzupassen.
Nach dem Klicken auf "OK" erzeugt die Anwendung ein neues Word-Dokument mit dem angegebenen Namen und startet den Downloadvorgang. Dieses exportierte Dokument enthält die Inhalte, die wir verarbeitet oder Änderungen, die wir innerhalb der Anwendung vorgenommen haben.
Im Laufe dieses Prozesses können wir sehen, dass die Anwendung wie beabsichtigt funktioniert. Wir können diese Anwendung verwenden, um Word-Dokumente zu importieren, Dokumente zu erstellen und sie problemlos zu exportieren. Die Benutzeroberfläche ist intuitiv und reaktionsschnell.
Abschließend zeigt unsere WordDocumentProcessor-Anwendung erfolgreich die Leistungsfähigkeit und Flexibilität der Integration der Verarbeitung von Word-Dokumenten in eine ASP.NET Core-Webanwendung. Indem wir die IronWord-Bibliothek nutzen, haben wir eine leistungsstarke Lösung zum einfachen Importieren, Anzeigen und Exportieren von Word-Dokumenten entwickelt. Diese Anwendung dient als solide Grundlage für komplexere Dokumentenmanagementsysteme oder Berichtsgeneratoren. Für Entwickler, die an der Erkundung der Fähigkeiten von IronWord interessiert sind, bietet die Bibliothek einkostenloser Test. Nach der Testversion beginnt die Lizenzierung bei $749, was es zu einer kostengünstigen Lösung für Unternehmen macht, die erweiterte Funktionen zur Verarbeitung von Word-Dokumenten in ihren Webanwendungen benötigen.
9 .NET API-Produkte für Ihre Bürodokumente