7

I have the following function that exports an html to excel:

function generateexcel(tableid) {
  var table= document.getElementById(tableid);
  var html = table.outerHTML;
  window.open('data:application/vnd.ms-excel,' + encodeURIComponent(html));
}

One problem is that the especial characters in the data are transformed to other symbols:

  • 1º = 1º
  • é = é

How would you fix this? Is there any character replace to the html to prevent it? Any encoding option?

2
  • Have you tried adding an explicit encoding declaration to the media type? data:application/vnd.ms-excel;charset=UTF-8 Commented Jun 18, 2012 at 14:07
  • Yep it was one of the solutions i found and tried before asking here, it didnt work with the different charsets i tried... Details here: weblogism.com/item/270/why-does-e-become-a and weblogism.com/item/271/why-does-e-become-a-ii Commented Jun 18, 2012 at 15:17

5 Answers 5

9

Replacing chars is a poor solution.

I replaced encodeURIComponent for escape and works fine, but escape is deprecated since ECMAScript v3.

This issue occurs because encodeURIComponent works with UTF-8 and Excel does not.

Better way for me.

Encode data to base64 and export like this. I used jquery-base64 plugin from https://github.com/carlo/jquery-base64/blob/master/jquery.base64.min.js

And change code to:

window.open('data:application/vnd.ms-excel;base64,' + $.base64.encode(html));

If you don't want to use jquery, you can use this base64_encode function http://phpjs.org/functions/base64_encode

"Base64 encoding/decoding is already a native function in modern(tm) browsers: btoa(str) and atob(str) are the functions that should can be used without any external reimplementation." - chipairon

Sign up to request clarification or add additional context in comments.

4 Comments

Its a good idea, if you could add a direct EncodetoBase64() function to your response for the people that dont want to use extra plugins like jquery i will grant the response to you
Base64 encoding/decoding is already a native function in modern(tm) browsers: btoa(str) and atob(str) are the functions that should can be used without any external reimplementation. Take a look at developer.mozilla.org/en-US/docs/Web/JavaScript/…
I set your answer as the correct one as promised, but if you could add the native function option contributed by @chipairon to the answer for other people to see it would be great ^^
And how do you name your file?
4

Solved adding a replace for the problematic symbols:

function generateexcel(tableid) {
  var table= document.getElementById(tableid);
  var html = table.outerHTML;

  //add more symbols if needed...
  while (html.indexOf('á') != -1) html = html.replace('á', 'á');
  while (html.indexOf('é') != -1) html = html.replace('é', 'é');
  while (html.indexOf('í') != -1) html = html.replace('í', 'í');
  while (html.indexOf('ó') != -1) html = html.replace('ó', 'ó');
  while (html.indexOf('ú') != -1) html = html.replace('ú', 'ú');
  while (html.indexOf('º') != -1) html = html.replace('º', 'º');

  window.open('data:application/vnd.ms-excel,' + encodeURIComponent(html));
}

3 Comments

Simpler (prob. faster too): html = html.replace(/á/g, '$aacute;'); etc. - the "g" after the regex makes it perform the substitution throughout the string, so you don't need the while loop.
@Pointy It works but the replace would be html = html.replace(/á/g, 'á'); not $, if you put it as an answer i will accept it
I think it is a poor solution, we have so much symbols to replace all. I replaced encodeURIComponent for escape and works fine.
3

I have the same issue, just replace encodeURIComponent for escape.

function generateexcel(tableid) {
 var table= document.getElementById(tableid);
 var html = table.outerHTML;
 window.open('data:application/vnd.ms-excel,' + escape(html));
}

It works for me...

1 Comment

As Pedro Muniz said, escape is being deprecated. It is preferable to use base64 encoding.
2

Just replace encodeURIComponent with escape.

Comments

1

In my case I use generateexcel function previously posted, just adding Capital letters of special characters in order to make it work

    function generateexcel(tableid) {
      var table= document.getElementById(tableid);
      var html = table.outerHTML;
      while (html.indexOf('á') != -1) html = html.replace('á', 'á');
      while (html.indexOf('Á') != -1) html = html.replace('Á', 'Á');
      while (html.indexOf('é') != -1) html = html.replace('é', 'é');
      while (html.indexOf('É') != -1) html = html.replace('É', 'É');
      while (html.indexOf('í') != -1) html = html.replace('í', 'í');
      while (html.indexOf('Í') != -1) html = html.replace('Í', 'Í');
      while (html.indexOf('ó') != -1) html = html.replace('ó', 'ó');
      while (html.indexOf('Ó') != -1) html = html.replace('Ó', 'Ó');
      while (html.indexOf('ú') != -1) html = html.replace('ú', 'ú');
      while (html.indexOf('Ú') != -1) html = html.replace('Ú', 'Ú');
      while (html.indexOf('º') != -1) html = html.replace('º', 'º');
      while (html.indexOf('ñ') != -1) html = html.replace('ñ', 'ñ'); 
      while (html.indexOf('Ñ') != -1) html = html.replace('Ñ', 'Ñ');  

  window.open('data:application/vnd.ms-excel,' + encodeURIComponent(html));
}

Hope it helps...

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.