Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование документа Word, для хранения в БД 
V
    Опции темы
Roo
  Дата 17.1.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



Как работать с документом Word на уровне байтов (нужно для хранения в БД)? Т.е. чтобы он не был доступен на диске в виде файла, а напрямую хранился в БД? Как это реализовать? И вообще, как использовать документ Word, не создавая самого файла .doc - чтобы он сохранялся через Word, но не в файл, а в байтовый поток? Не могу ничего по этому поводу в MSDN найти. Может, какие ссылки кто даст?..
PM MAIL   Вверх
mr.DUDA
Дата 18.1.2006, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Если есть объект Document (вордовский, который через Interop.Word создан), можно выделить всё, сделать Copy, а потом сериализованный документик доступен в Clipboard-е, откуда его выцепить проще простого. И наоборот.


--------------------
user posted image
PM MAIL WWW   Вверх
Roo
Дата 18.1.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



А нельзя ли примерчик какой? Из Document в Object -- в принципе понятно, а вот в обратную сторону не могу сообразить... До этого не приходилось с вёрдом из .net работать ((((
PM MAIL   Вверх
mr.DUDA
Дата 19.1.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вот работающий пример (компилируется при добавлении reference на "Microsoft Word 11.0 object library" и System.Windows.Forms):

Код
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);
    }
}


Это сообщение отредактировал(а) mr.DUDA - 19.1.2006, 10:45


--------------------
user posted image
PM MAIL WWW   Вверх
mr.DUDA
Дата 21.1.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Roo @ 20.1.2006, 18:08 Найти цитируемый пост)
Огромный обисапС!!!
Появился ещё один важный вопрос, но решил не создавать для него новую тему. Можно ли как-то заместить сохранение документа в вёрде? Т.е. когда пользователь нажимает кнопку сохранить (или Shift+F12), не вылетает окно для сохранения файла (т.к. нам файл здесь вообще не нужен), а выполняются какие-то "наши" действия (например GetBinaryData(...) из Вашего кода) и "наше" же сообщение-уведомление, что всё сохранено. Пробовал экспериментировать с событием DocumentBeforeSave, но дальше - ничего не пошло...
Спасите, если можете =)))

Одна тема - один вопрос, я создал отдельную тему:
http://forum.vingrad.ru/index.php?showtopic=80578


--------------------
user posted image
PM MAIL WWW   Вверх
Roo
Дата 21.1.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



СПАСИБО, mr.DUDA!
PM MAIL   Вверх
mr.DUDA
Дата 21.1.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Пожалуйста smile


--------------------
user posted image
PM MAIL WWW   Вверх
RedButterfly
Дата 28.8.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



-----

Это сообщение отредактировал(а) RedButterfly - 18.9.2008, 13:11
PM MAIL ICQ Skype   Вверх
RedButterfly
Дата 29.8.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



*****

Это сообщение отредактировал(а) RedButterfly - 18.9.2008, 13:11
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1267 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.