Word 2007 сохраняет свои документы в формате .docx, который на самом деле представляет собой zip-файл с множеством вещей в нем, включая XML-файл с документом.
Я хочу иметь возможность взять файл .docx и поместить его в папку в моем веб-приложении asp.net, чтобы код открывал файл .docx и отображал (xml-часть) документ как веб-страницу.
Я искал в Интернете дополнительную информацию по этому поводу, но пока мало что нашел. Мои вопросы:
Спасибо!





Попробовать этот почтовый? Я не знаю, но, возможно, это то, что вы ищете.
Word 2007 имеет API, который можно использовать для преобразования в HTML. Вот пост, в котором говорится об этом http://msdn.microsoft.com/en-us/magazine/cc163526.aspx. Вы можете найти документацию по API, но я помню, что в API есть функция преобразования в HTML.
Этот код поможет преобразовать файл .docx в текст.
function read_file_docx($filename){
$striped_content = '';
$content = '';
if (!$filename || !file_exists($filename)) { echo "sucess";}else{ echo "not sucess";}
$zip = zip_open($filename);
if (!$zip || is_numeric($zip)) return false;
while ($zip_entry = zip_read($zip)) {
if (zip_entry_open($zip, $zip_entry) == FALSE) continue;
if (zip_entry_name($zip_entry) != "word/document.xml") continue;
$content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
zip_entry_close($zip_entry);
}// end while
zip_close($zip);
//echo $content;
//echo "<hr>";
//file_put_contents('1.xml', $content);
$content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
$content = str_replace('</w:r></w:p>', "\r\n", $content);
//header("Content-Type: plain/text");
$striped_content = strip_tags($content);
$striped_content = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@/\_\(\)]/","",$striped_content);
echo nl2br($striped_content);
}
Я использую Interop. Это несколько проблематично, но в большинстве случаев работает нормально.
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Word;
Это возвращает список путей к преобразованным HTML-документам.
public List<string> GetHelpDocuments()
{
List<string> lstHtmlDocuments = new List<string>();
foreach (string _sourceFilePath in Directory.GetFiles(""))
{
string[] validextentions = { ".doc", ".docx" };
if (validextentions.Contains(System.IO.Path.GetExtension(_sourceFilePath)))
{
sourceFilePath = _sourceFilePath;
destinationFilePath = _sourceFilePath.Replace(System.IO.Path.GetExtension(_sourceFilePath), ".html");
if (System.IO.File.Exists(sourceFilePath))
{
//checking if the HTML format of the file already exists. if it does then is it the latest one?
if (System.IO.File.Exists(destinationFilePath))
{
if (System.IO.File.GetCreationTime(destinationFilePath) != System.IO.File.GetCreationTime(sourceFilePath))
{
System.IO.File.Delete(destinationFilePath);
ConvertToHTML();
}
}
else
{
ConvertToHTML();
}
lstHtmlDocuments.Add(destinationFilePath);
}
}
}
return lstHtmlDocuments;
}
И этот для преобразования документа в HTML.
private void ConvertToHtml()
{
IsError = false;
if (System.IO.File.Exists(sourceFilePath))
{
Microsoft.Office.Interop.Word.Application docApp = null;
string strExtension = System.IO.Path.GetExtension(sourceFilePath);
try
{
docApp = new Microsoft.Office.Interop.Word.Application();
docApp.Visible = true;
docApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
object fileFormat = WdSaveFormat.wdFormatHTML;
docApp.Application.Visible = true;
var doc = docApp.Documents.Open(sourceFilePath);
doc.SaveAs2(destinationFilePath, fileFormat);
}
catch
{
IsError = true;
}
finally
{
try
{
docApp.Quit(SaveChanges: false);
}
catch { }
finally
{
Process[] wProcess = Process.GetProcessesByName("WINWORD");
foreach (Process p in wProcess)
{
p.Kill();
}
}
Marshal.ReleaseComObject(docApp);
docApp = null;
GC.Collect();
}
}
}
Убивать слово - это не весело, но нельзя позволять ему висеть и блокировать других, верно?
В Интернете / html я визуализирую html в iframe.
Есть выпадающий список со списком справочных документов. Значение - это путь к его html-версии, а текст - это имя документа.
private void BindHelpContents()
{
List<string> lstHelpDocuments = new List<string>();
HelpDocuments hDoc = new HelpDocuments(Server.MapPath("~/HelpDocx/docx/"));
lstHelpDocuments = hDoc.GetHelpDocuments();
int index = 1;
ddlHelpDocuments.Items.Insert(0, new ListItem { Value = "0", Text = "---Select Document---", Selected = true });
foreach (string strHelpDocument in lstHelpDocuments)
{
ddlHelpDocuments.Items.Insert(index, new ListItem { Value = strHelpDocument, Text = strHelpDocument.Split('\')[strHelpDocument.Split('\').Length - 1].Replace(".html", "") });
index++;
}
FetchDocuments();
}
при изменении выбранного индекса, он переносится во фрейм
protected void RenderHelpContents(object sender, EventArgs e)
{
try
{
if (ddlHelpDocuments.SelectedValue == "0") return;
string strHtml = ddlHelpDocuments.SelectedValue;
string newaspxpage = strHtml.Replace(Server.MapPath("~/"), "~/");
string pageVirtualPath = VirtualPathUtility.ToAbsolute(newaspxpage);//
documentholder.Attributes["src"] = pageVirtualPath;
}
catch
{
lblGError.Text = "Selected document doesn't exist, please refresh the page and try again. If that doesn't help, please contact Support";
}
}
Ужасная идея использовать Office Interop из ASP.NET или другой серверной технологии. Эти API-интерфейсы были написаны для использования в настольном приложении для автоматизации Office (набора настольных приложений). Серверные приложения во многом отличаются, поэтому использование в них Office Interop - очень и очень плохая идея. Он также не поддерживается Microsoft и может нарушать вашу лицензию на Office. См. Рекомендации по серверной автоматизации Office
@JohnSaunders, я знаю, что это ужасная идея, но требования нелегко сбить с толку. Я был бы очень признателен за хорошую альтернативу для этого вопроса.
Я написал mammoth.js, библиотеку JavaScript, которая конвертирует файлы docx в HTML. Если вы хотите выполнить рендеринг на стороне сервера в .NET, существует также версия Mammoth доступно на NuGet для .NET.
Mammoth пытается создать чистый HTML, просматривая семантическую информацию - например, сопоставляя стили абзацев в Word (например, Heading 1) с соответствующими тегами и стилями в HTML / CSS (например, <h1>). Если вам нужно что-то, что производит точную визуальную копию, Mammoth, вероятно, не для вас. Если у вас есть что-то, что уже хорошо структурировано, и вы хотите преобразовать это в аккуратный HTML, Mammoth может помочь.
dotnet-mammoth - полезная библиотека, я ее использую и отлично работает. У меня проблема только при развертывании, если вы можете взглянуть на нее здесь.
Не могли бы вы уточнить, о каком API вы говорите и какая функция «конвертировать в HTML»? Возможно, вы говорите о классе Package? Где эта функция "конвертировать в HTML"?