Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Как сохранить документ Word в базе Access?


Автор: Loiste 6.3.2006, 13:20
сабж...
открываю файл Word
читаю абзац
хочу потом сохранить прочитанную инфу как документ Word в базе Access
как это сделать?

Автор: Exception 6.3.2006, 14:33
Прочитать абзац:
Код

Imports Microsoft.Office.Interop.Word

Public Class Main

    Private _wdApplication As New Microsoft.Office.Interop.Word.Application
    Private _wdDocument As Document = _wdApplication.Documents.Open("E:\WordFile.doc")

    Private Sub ShowText_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MessageBox.Show(_wdDocument.Paragraphs(1).Range.Text, "Текст 1-го параграфа", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub

    Private Sub Main_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        _wdDocument.Close(True)
        _wdApplication.Quit()
    End Sub

End Class

А по поводу сохранения его в базу Access -- юзай поиск, не раз обсуждалось.

Автор: Exception 6.3.2006, 15:50
http://vingrad.ru/NET-VBNET-003016
уффф... smile

Автор: Loiste 7.3.2006, 09:30
Как читать документ я знаю smile

Я не знаю как сохранить в базе.

А поиск не работает.

Автор: Exception 7.3.2006, 11:47
Искать надо в разделе "Базы данных для .NET".

Автор: Akina 7.3.2006, 12:38
Конвертани в RTF и спокойно засовывай в МЕМО...

Автор: Exception 7.3.2006, 12:48
Погоди-ка. Тебе форматирование сохранять надо?

Автор: Loiste 9.3.2006, 09:14
Код


using System;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;
using System.Windows.Forms;
using Microsoft.Office.Interop.Word;

class DocumentSerializeDemo
{
    static byte[] GetBinaryData(Document doc)
    {
        Clipboard.SetDataObject(new DataObject(""));
        doc.Select();
        doc.Application.Selection.Copy();

        Hashtable tb = new Hashtable();
        IDataObject ido = Clipboard.GetDataObject();
        foreach(string format in ido.GetFormats())
            tb[format] = ido.GetData(format);

        BinaryFormatter fmt = new BinaryFormatter();
        MemoryStream stream = new MemoryStream();
        fmt.Serialize(stream, tb);
        return stream.GetBuffer();
    }

    static void RestoreFromBinaryData(byte[] bin, Document targetDoc)
    {
        Clipboard.SetDataObject(new DataObject(""));
        BinaryFormatter fmt = new BinaryFormatter();
        MemoryStream stream = new MemoryStream(bin);
        Hashtable tb = (Hashtable)fmt.Deserialize(stream);
        DataObject ido = new DataObject();
        foreach(string format in tb.Keys)
            ido.SetData(format, tb[format]);
        Clipboard.SetDataObject(ido);

        targetDoc.Select();
        targetDoc.Application.Selection.Paste();
    }

    [STAThread]
    static void Main(string[] args)
    {
        object empty = Missing.Value;
        object rfalse = false;

        ApplicationClass app = new ApplicationClass();
        Document doc = app.Documents.Add(ref empty, ref empty, ref empty, ref empty);
        doc.Select();
        app.Selection.TypeText("содержимое документа");

        byte[] data = GetBinaryData(doc);
        doc.Close(ref rfalse, ref empty, ref empty);

        Document restoredDoc = app.Documents.Add(ref empty, ref empty, ref empty, ref empty);
        RestoreFromBinaryData(data, restoredDoc);
        object rfileName = "c:\\1.doc";
        restoredDoc.SaveAs(ref rfileName, ref empty, ref empty, ref empty, ref empty,
            ref empty, ref empty, ref empty, ref empty, ref empty, ref empty,
            ref empty, ref empty, ref empty, ref empty, ref empty);

        app.Quit(ref rfalse, ref empty, ref empty);
    }

 


Вот об этом примере шла речь?

Да, мне нужно полностью сохранять структуру документа. Текст, рисунки, таблицы. Просто хранить его мне нужно именно в базе, а не на винте.

Автор: Exception 9.3.2006, 11:31
Ну дык прекрасно (как будет время, добавлю в FAQ)! Что осталось непонятным?

Автор: Loiste 9.3.2006, 13:00
Непонятно, почему на строке №42: targetDoc.Application.Selection.Paste(); выскакивает ошибка "Ошибка команды".
Если же я дохожу до строки, где данные помещаются в буфер. Потом вручную открываю новый документ Word. У меня видно, что в буфере что-то есть, но если я пытаюсь вставить эти данные в документ он мне пишет, что буфер пуст или содержит неверные данные!

Вот это непонятно smile

Автор: Loiste 9.3.2006, 14:06
Сделала по-другому smile
Теперь работает.

Автор: Exception 9.3.2006, 14:37
А поделиться с другими smile ?

Автор: Loiste 9.3.2006, 14:53
Конечно, просто, кушать очень хотелось)))

Я сделала вот так:

//адрес читаемого файла


Код

Dim strDocumentFullName As String
strDocumentFullName = "Новый.doc"



//определяем размер читаемого файла

Код

Dim oFile As System.IO.FileInfo
oFile = New System.IO.FileInfo(strDocumentFullName)
Dim oFileStream As System.IO.FileStream = oFile.OpenRead()
Dim intTotalBytes As Int32 = oFileStream.Length
oFileStream.Close()

//читаем файл в байтовый массив и затем конвертируем в строку

Код

Dim BR As New IO.BinaryReader(IO.File.OpenRead(strDocumentFullName))
Dim bArray(intTotalBytes) As Byte
bArray = BR.ReadBytes(intTotalBytes)
Dim strBuffer As String
strBuffer = System.Text.Encoding.Default.GetString(bArray)
BR.Close()


//читаем инфу из строки в байтовый массив и затем записываем в файл

Код

Dim Writer As IO.BinaryWriter
Writer = New IO.BinaryWriter(IO.File.Create("New.doc"))
Dim bArray2 As Byte()
bArray2 = System.Text.Encoding.Default.GetBytes(strBuffer)
Writer.Write(bArray2)
Writer.Flush()
Writer.Close()


Решение не мое - нашла на какой-то странице, плюс кое-что взяла с другой страницы и еще один момент мне подсказали))
Добавлено @ 14:57
Да, но только. Это решение для целого документа. А не подскажете как мне записать в байтовый массив отдельно прочитанный абзац - paragraph.range ?
Добавлено @ 15:06
А с этим примером, через буфер, что там с этой ошибкой делать? Я выше описала проблему.

Автор: Exception 9.3.2006, 19:30
Вот этот код помещает в буфер обмена содержимое первого параграфа в виде RTF:
Код

        Dim _wdApplication As New Microsoft.Office.Interop.Word.Application 'Приложение Word
        Dim _wdDocument As Document = _wdApplication.Documents.Open("E:\Word.doc") 'Документ Word
        _wdDocument.Paragraphs(1).Range.Copy() 'Копируем первый параграф
        Console.WriteLine(Clipboard.GetData("Rich Text Format")) 'Получаем его в виде RTF
        _wdApplication.Quit(True)

Автор: Loiste 10.3.2006, 09:13
Я не о том smile
Как его в поток загнать? Параграф этот..

Да и я уже говорила, что в том примере с буфером обмена у меня ошибка выскакивает.

Автор: Exception 10.3.2006, 14:38
У меня этот код работает на ура:
Код

        Dim _wdApplication As New Microsoft.Office.Interop.Word.Application 'Приложение Word
        Dim _wdDocument As Document = _wdApplication.Documents.Open("E:\Word.doc") 'Документ Word
        _wdDocument.Paragraphs(1).Range.Copy() 'Копируем первый параграф
        _wdApplication.Quit(True)
        Dim str As String = CStr(Clipboard.GetData("Rich Text Format")) 'Эту строку можно засунуть в БД
        '---
        '---
        _wdApplication = New Microsoft.Office.Interop.Word.Application 'Приложение Word
        _wdDocument = _wdApplication.Documents.Open("E:\Word2.doc") 'Документ Word
        _wdDocument.Range.Paste() 'Вставляем первый параграф
        _wdApplication.Quit(True)

Автор: Loiste 10.3.2006, 15:30
Код

 Dim str As String = CStr(Clipboard.GetData("Rich Text Format")) 'Эту строку можно засунуть в БД


а это интересно))
в понедельник попробую smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)