Zapis do pliku .doc - kolorowy tekst

0

Witam,
Zapisuje sobie do pliku .doc dane, których kolor czcionki jest domyślnie czarny. Jak ustawić aby dane były zapisywane w kolorze czerwonym?

1

W jaki sposób to robisz? Czy zapisujesz bezpośrednio do pliku, czy korzystasz z jakiejś biblioteki do tego przeznaczonej?
Daj jakiś kod dotyczący zapisu - pokaż, jak to robisz aktualnie.

0
$file = dirname(__FILE__) . '/plik.doc';

$data =  "12345";
file_put_contents($file,$data, FILE_APPEND);

i jak coś takiego zapisać w kolorze czerwonym?

1

No ale to, co robisz nie jest zapisem pliku DOC, tylko stworzeniem pliku tekstowego z rozszerzeniem doc. To nie ma prawa działać w taki sposób, jaki sobie wymyśliłeś.

Jeśli chcesz naprawdę zapisywać dane do plików Worda, masz 2 opcje: albo sobie poczytać, jaką strukturę wewnętrzną mają pliki tego typu, a następnie ręcznie zapisać dane zgodnie z tym standardem, albo skorzystać z gotowej biblioteki, która to ogarnie za Ciebie. Osobiście polecam podejście numer 2. W necie jest wiele bibliotek/pakietów, które realizują to zadanie, możesz rzucić okiem chociażby na https://github.com/PHPOffice/PHPWord

0
cerrato napisał(a):

No ale to, co robisz nie jest zapisem pliku DOC, tylko stworzeniem pliku tekstowego z rozszerzeniem doc. To nie ma prawa działać w taki sposób, jaki sobie wymyśliłeś.

Jak ten kod mi działa, tworzy plik .doc i otwiera się poprawnie w wordzie, tylko czy da się jakoś w prosty sposób zmienić przy tym zapisie kolor czcionki? Czy pozostaje tylko jedna z 2 opcji które podałeś?

1
asdf42 napisał(a):
cerrato napisał(a):

No ale to, co robisz nie jest zapisem pliku DOC, tylko stworzeniem pliku tekstowego z rozszerzeniem doc. To nie ma prawa działać w taki sposób, jaki sobie wymyśliłeś.

Jak ten kod mi działa, tworzy plik .doc i otwiera się poprawnie w wordzie,

W Wordzie możesz sobie otwierać pliki w różnych formatach (w tym np TXT) ale nie stają się one przez to plikami Worda. Nadanie plikowi określonego rozszerzenia również nie zmienia jego wewnętrznego formatu.

Czy pozostaje tylko jedna z 2 opcji które podałeś?

Mógłbyś jeszcze spróbować zapisu do RTF, konstrukcję mają dużo czytelniejszą niż DOC/DOCX, a pozwalają uzyskać efekt, o którym piszesz.

0
cerrato napisał(a):

Osobiście polecam podejście numer 2. W necie jest wiele bibliotek/pakietów, które realizują to zadanie, możesz rzucić okiem chociażby na https://github.com/PHPOffice/PHPWord

Pobrałem to z github, wypakowałem i wkleiłem do C:\xampp\htdocs
W pliku composer.json dodałem

"phpoffice/phpword": "v0.16.*"

czyli jest:

"require": {
        "php": "^5.3.3 || ^7.0",
        "ext-xml": "*",
        "zendframework/zend-escaper": "^2.2",
		"phpoffice/phpword": "v0.16.*",
        "phpoffice/common": "^0.2.9"
    },

W głównym katalogu utworzyłem sobie plik zapis.php
którą ma taki kod (nie wiem czy jest poprawny) :

<?php
require_once 'bootstrap.php';

// Creating the new document...
$phpWord = new \PhpOffice\PhpWord\PhpWord();

/* Note: any element you append to a document must reside inside of a Section. */

// Adding an empty Section to the document...
$section = $phpWord->addSection();

// Adding Text element with font customized using named font style...
$fontStyleName = 'oneUserDefinedStyle';
$phpWord->addFontStyle(
    $fontStyleName,
    array('name' => 'Tahoma', 'size' => 10, 'color' => 'FF0000', 'bold' => true)
);
$section->addText(
    '12345',
    $fontStyleName
);

// Saving the document as OOXML file...
$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save('helloWorld.docx');
?>

Przy wywołaniu strony http://127.0.0.1/PhpWord-develop/zapis.php
wyświetla się:

Fatal error: Uncaught Exception: Could not find file '/autoload.php'. It is generated by Composer. Use 'install --prefer-source' or 'update --prefer-source' Composer commands to move forward. in C:\xampp\htdocs\PHPWord-develop\bootstrap.php:22 Stack trace: #0 C:\xampp\htdocs\PHPWord-develop\zapis.php(2): require_once() #1 {main} thrown in C:\xampp\htdocs\PHPWord-develop\bootstrap.php on line 22

plik bootstrap.php
ma taki kod:

<?php
/**
 * This file is part of PHPWord - A pure PHP library for reading and writing
 * word processing documents.
 *
 * PHPWord is free software distributed under the terms of the GNU Lesser
 * General Public License version 3 as published by the Free Software Foundation.
 *
 * For the full copyright and license information, please read the LICENSE
 * file that was distributed with this source code. For the full list of
 * contributors, visit https://github.com/PHPOffice/PHPWord/contributors. test bootstrap
 *
 * @see         https://github.com/PHPOffice/PHPWord
 * @copyright   2010-2018 PHPWord contributors
 * @license     http://www.gnu.org/licenses/lgpl.txt LGPL version 3
 */

$vendorDirPath = realpath(__DIR__ . '/vendor');
if (file_exists($vendorDirPath . '/autoload.php')) {
    require $vendorDirPath . '/autoload.php';
} else {
    throw new Exception(
        sprintf(
            'Could not find file \'%s\'. It is generated by Composer. Use \'install --prefer-source\' or \'update --prefer-source\' Composer commands to move forward.',
            $vendorDirPath . '/autoload.php'
        )
    );
}

Pobrałem i zainstalowałem Composer-Setup.exe
w cmd komenda composer -V pokazuję Composer version 1.9.1 2019-11-01 17:20:17
Ktoś wie czemu mi to nie działa i w czym jest problem?

2

A czy wiesz, co to jest Composer i do czego służy?

Moim zdaniem to samo pobranie Composera nie starczy, powinieneś pakiet PHPWord pobrać/zainstalować u siebie właśnie z użyciem Composera.

Zresztą nawet piszą o tym w Readme tego projektu - https://github.com/PHPOffice/PHPWord/blob/develop/README.md#installation:

PHPWord is installed via Composer. To add a dependency to PHPWord in your project, either

Run the following to use the latest stable version

    composer require phpoffice/phpword

Poza tym możesz spróbować odpalić u siebie któryś z przykładów dostarczonych z projektem - https://github.com/PHPOffice/PHPWord/tree/develop/samples

0
cerrato napisał(a):

A czy wiesz, co to jest Composer i do czego służy?

Moim zdaniem to samo pobranie Composera nie starczy, powinieneś pakiet PHPWord pobrać/zainstalować u siebie właśnie z użyciem Composera.

Zresztą nawet piszą o tym w Readme tego projektu - https://github.com/PHPOffice/PHPWord/blob/develop/README.md#installation:

PHPWord is installed via Composer. To add a dependency to PHPWord in your project, either

Run the following to use the latest stable version

    composer require phpoffice/phpword

Poza tym możesz spróbować odpalić u siebie któryś z przykładów dostarczonych z projektem - https://github.com/PHPOffice/PHPWord/tree/develop/samples

Wykonałem composer require phpoffice/phpword w cmd
i dalej

Fatal error: Uncaught Exception: Could not find file '/autoload.php'. It is generated by Composer. Use 'install --prefer-source' or 'update --prefer-source' Composer commands to move forward. in C:\xampp\htdocs\PHPWord\bootstrap.php:22 Stack trace: #0 C:\xampp\htdocs\PHPWord\zapis.php(2): require_once() #1 {main} thrown in C:\xampp\htdocs\PHPWord\bootstrap.php on line 22
1

Nie wczytuj bootstrapa obcej biblioteki tylko https://getcomposer.org/doc/01-basic-usage.md#autoloading czyli:

require __DIR__ . '/vendor/autoload.php';

Jak nie pomoże to pokaż strukturę plików na serwerze, a idealnie było by gdybyś wrzucił swój kod na github.com.

0
Markuz napisał(a):

Nie wczytuj bootstrapa obcej biblioteki tylko https://getcomposer.org/doc/01-basic-usage.md#autoloading czyli:

require __DIR__ . '/vendor/autoload.php';

Jak nie pomoże to pokaż strukturę plików na serwerze, a idealnie było by gdybyś wrzucił swój kod na github.com.

Plik zapis.php

<?php
//require_once 'bootstrap.php';
require __DIR__ . '/vendor/autoload.php';

// Creating the new document...
$phpWord = new \PhpOffice\PhpWord\PhpWord();

/* Note: any element you append to a document must reside inside of a Section. */

// Adding an empty Section to the document...
$section = $phpWord->addSection();

// Adding Text element with font customized using named font style...
$fontStyleName = 'oneUserDefinedStyle';
$phpWord->addFontStyle(
    $fontStyleName,
    array('name' => 'Tahoma', 'size' => 10, 'color' => 'FF0000', 'bold' => true)
);
$section->addText(
    '12345',
    $fontStyleName
);

// Saving the document as OOXML file...
$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save('helloWorld.docx');


?>

No ale w tym katalogu nawet nie ma ani folderu vendor ani pliku autoload.php

Przy wywołaniu strony http://127.0.0.1/PhpWord/zapis.php
teraz taki błąd:

Warning: require(C:\xampp\htdocs\PHPWord/vendor/autoload.php): failed to open stream: No such file or directory in C:\xampp\htdocs\PHPWord\zapis.php on line 3

Fatal error: require(): Failed opening required 'C:\xampp\htdocs\PHPWord/vendor/autoload.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\PHPWord\zapis.php on line 3
1

Czy jest jakiś powód dla którego to muszą(?) być pliki DOC.
Czy mgą być np HTML albo ew. RTF?

1

@asdf42: To weź sobie zapisz przykładowy plik RTF z kilkoma liniami w tym jedną wyróżnioną kolorem i zobacz w Notepad++ jak ten plik od środka wygląda. A później możesz sobie dla swoich potrzeb przekopiować jego nagłówek i dodawać kolejne wiersze:

\par jeden
\par dwa
\par trzy
\par }{\cf6 cztery (czerwone)
\par }{pi\'ea\'e6
\par sze\'9c\'e6

Istnieją też biblioteki pozwalające generować pliki PDF.

i nie chce tego na stronie oglądać tylko najlepiej .doc chociaż RTF też może być

Jeśli problem sprowadza się do tego, że chcesz plik zapisać plik, zamiast otwierać go w przeglądarce, to możesz spokojnie użyć HTML i tagu download, żeby wymusić pobieranie pliku:
https://www.w3schools.com/tags/att_a_download.asp

0
asdf42 napisał(a):
cerrato napisał(a):

A czy wiesz, co to jest Composer i do czego służy?

Moim zdaniem to samo pobranie Composera nie starczy, powinieneś pakiet PHPWord pobrać/zainstalować u siebie właśnie z użyciem Composera.

Zresztą nawet piszą o tym w Readme tego projektu - https://github.com/PHPOffice/PHPWord/blob/develop/README.md#installation:

PHPWord is installed via Composer. To add a dependency to PHPWord in your project, either

Run the following to use the latest stable version

    composer require phpoffice/phpword

Poza tym możesz spróbować odpalić u siebie któryś z przykładów dostarczonych z projektem - https://github.com/PHPOffice/PHPWord/tree/develop/samples

Wykonałem composer require phpoffice/phpword w cmd
i dalej

Fatal error: Uncaught Exception: Could not find file '/autoload.php'. It is generated by Composer. Use 'install --prefer-source' or 'update --prefer-source' Composer commands to move forward. in C:\xampp\htdocs\PHPWord\bootstrap.php:22 Stack trace: #0 C:\xampp\htdocs\PHPWord\zapis.php(2): require_once() #1 {main} thrown in C:\xampp\htdocs\PHPWord\bootstrap.php on line 22

Tak jak by ło napisane w tym katalogu nawet nie ma ani folderu vendor ani pliku autoload.php. Sprawdziłem to u siebie i u mnie działa jako HTML

1 użytkowników online, w tym zalogowanych: 0, gości: 1