Máme-li intranetovou nebo i internetovou aplikaci, která dává uživatelům k dispozici šablony dokumentů nebo samotné dokumenty ve formátu MS Office, můžeme vylepšit jejich komfort tak, že naše aplikace nebude nabízet pouze soubory ke stažení, ale rovnou spustí patřičnou aplikaci (Word, Excel apod.) a dokument v ní otevře.

Při řešení jsem využil komponenty ActiveX, které se do systému klienta nainstalují současně s instalací programů MS Office. ActiveX podporuje pouze prohlížeč MSIE (stupeň zabezpečení je nutné snížit na minimum, tedy hodnotu Nízká), v jiných prohlížečích nebude popisovaná metoda funkční.

Základem je skript, který se pokusí vytvořit novou instanci objektu pro přístup k aplikaci MS Office. Pokud je vytvoření úspěšné (aplikace je řádně nainstalována a funkční), je možné ji ovládat – spustit a otevřít v ní dokument. V našem případě navíc nastavíme aplikaci tak, aby byla viditelná (aby ji uživatel viděl). Aplikace je ale možné spouštět i neviditelně na pozadí, například pro konverzi souborů atp. Skript si uložíme do souboru msoffice.js:

function startOffice(OfficeFile,OfficeApp,close)
{
  var message="";
  if (navigator.appName==’Microsoft Internet Explorer‘)
  { // otestovat, zda jde o IE
    var startApp = new ActiveXObject(OfficeApp+".Application")
    if (startApp != null)
    {
      startApp.Visible = true; // nastavit viditelnost aplikace
      switch(OfficeApp)
      { // vybrat akci pro otevření dokumentu v aplikaci
        case "Word":
          startApp.Documents.Open(OfficeFile);
        break;
        case "Excel":
          startApp.Workbooks.Open(OfficeFile);
        break;
        case "PowerPoint":
          startApp.Presentations.Open(OfficeFile);
        break;
        default:
          startApp.Documents.Open(OfficeFile);
        break;
      }
      if (close==1)
     { // zavřít původní okno
        top.opener="startApp";
        top.window.close();
      }
    }
   else
     message="Aplikaci MS Office nelze spustit, možná není řádně nainstalovaná!";
  }
  else
    message="Prohlížeč není MS Internet Explorer, aplikaci MS Office nelze spustit!";
  if (message!="")
  {
    message = message + "\nSoubor bude nabídnut ke stažení.";
    alert(message);
    window.location=OfficeFile;
  }
}

Ve skriptu je definována funkce, která bude spouštět aplikace MS Office. Jako parametry se jí předává jméno souboru, který chceme v aplikaci otevřít, jméno aplikace a parametr, který určuje, zda chceme, aby se zavřelo původní okno, ze kterého bude aplikace spuštěna. Funkce zjistí, zda jde o prohlížeč Internet Explorer. Pokud ano, provede se pokus o vytvoření objektu. Proběhne-li řádně, nastaví se viditelnost aplikace a současně se vybere akce sloužící pro otevření dokumentu. Pro každou aplikaci je totiž akce pojmenována jinak, takže nelze jednoduše napsat jeden řádek, který by otevřel dokument v libovolné aplikaci. V našem skriptu jsou dostupné aplikace Word, Excel a PowerPoint, podobně je možné pracovat s aplikacemi Access, Outlook, Graph a Office Web Component (viz MSDN – OLE Programmatic Identifiers). Pokud dojde při spouštění aplikace k chybě, skript nabídne soubor ke stažení.

Máte-li jednoduchou statickou stránku s nabídkou několika dokumentů, stačí přidat do kódu skript s funkcí a odkazy na dokumenty upravit podle následujícího příkladu:

<script type="text/javascript" src="handle/msoffice.js"></script>

<a href="soubor.doc" onclick="startOffice(‚http://server.cz/cesta/soubor.doc‘,’Word‘,0); return false" target="_blank">Soubor.doc</a>
 

Do odkazu je doplněno na událost onclick volání funkce startOffice s parametry úplné cesty k souboru, jméno aplikace, ve které se má soubor otevřít a parametr, který v našem případě určuje, že se nemá zavřít okno, ve kterém se na odkaz klikne.

Pokud máme větší aplikaci, kde se nabízené dokumenty generují dynamicky z databáze (může jít například o souborovou nástěnku), použijeme skript, který automaticky rozpozná, v jaké aplikaci má být soubor otevírán a zda je vůbec možné ho v nějaké otevřít. Pokud ne, nabídne jen soubor ke stažení:

<script type="text/javascript" src="handle/msoffice.js"></script>
<?php
$suffix=SubStr($filename, StrPos($filename,".")+1); // vyjmout příponu souboru
switch ($suffix)
{ // podle přípony nastavit aplikaci, ve které budeme soubor otevírat
  case ‚doc‘: $appname = "Word"; break;
  case ‚dot‘: $appname = "Word"; break;
  case ‚sam‘: $appname = "Word"; break;
  case ‚602‘: $appname = "Word"; break;
  case ‚asc‘: $appname = "Word"; break;
  case ‚ans‘: $appname = "Word"; break;
  case ‚wri‘: $appname = "Word"; break;
  case ‚wpd‘: $appname = "Word"; break;
  case ‚mcw‘: $appname = "Word"; break;
  case ‚rtf‘: $appname = "Word"; break;
  case ‚txt‘: $appname = "Word"; break;
  case ‚htm‘: $appname = "Word"; break;
  case ‚html‘: $appname = "Word"; break;
  case ‚xls‘: $appname = "Excel"; break;
  case ‚xl‘: $appname = "Excel"; break;
  case ‚xlt‘: $appname = "Excel"; break;
  case ‚xla‘: $appname = "Excel"; break;
  case ‚xlm‘: $appname = "Excel"; break;
  case ‚csv‘: $appname = "Excel"; break;
  case ‚xlc‘: $appname = "Excel"; break;
  case ‚xlw‘: $appname = "Excel"; break;
  case ‚dbf‘: $appname = "Excel"; break;
  case ‚ppt‘: $appname = "Powerpoint"; break;
}
if (!empty($appname))
{?>
<a href="<?php echo $filename ?>" onclick="startOffice(‚http://server.cz/cesta<?php echo $filename‘,'<?php echo $appname ?>‘,0); return false" target="_blank">Spustit <?php echo $appname ?></a>
<?php } ?>

Skript si vytáhne příponu souboru z názvu uvedeného v proměnné $filename, následně se pokusí vybrat název aplikace, ve které se bude dokument otevírat. Pokud se k zadanému souboru podařilo najít spouštěcí aplikaci, vygeneruje se odkaz na start aplikace.

Při použití v intranetu je na počítačích klientů potřeba ověřit nastavení zabezpečení zóny intranet. Bude totiž potřeba povolit spouštění podepsaných prvků ActiveX, jinak nepůjde aplikace startovat vůbec nebo bude uživatel obtěžován výzvou na povolení interakce prvku ActiveX. Dobré je také v aplikacích Office aktivovat možnost "potvrdit převod při otevírání". Pak je možné otevírat i dokumety vytvořené v jiných aplikacích (T602,AmiPro, FoxPro a jiné).

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět