es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Descargar un archivo de Excel desde el almacenamiento en la nube de Google devuelve un búfer, ¿cómo puedo devolver el archivo de Excel real para que pueda escribir en él en mi controlador?

Estoy intentando recuperar un archivo de Excel de mi cubo utilizando Firebase Admin SDK con el siguiente código:

export const getTemplate = async (fileName: string) => {
  const filePath = admin
    .storage()
    .bucket()
    .file('sheets/template.xlsx')

  const [file] = await filePath.download()
  return file
}

Luego paso lo que se devuelve de esta función a esta función:

export const writeToTemplate = (
  objects: any[],
  sheetNames: string[],
  file
) => {

  objects.forEach((dataObject, index) => {
    const sheetName = sheetNames[index]
    const worksheet = templateFile.Sheets[sheetName]
    utils.sheet.addJson(worksheet, dataObject)
  })
  return file
}

Sin embargo, esto arroja un error que no puede leer mi archivo. Cuando registro en la consola el archivo, muestra un buffer:

<buffer 50="" 4b="" 03="" 04="" 14="" 00="" 06="" 00="" 08="" 00.........="">

¿Cómo puedo escribir realmente en el archivo? Saludos 🙂

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar en la forma en que el parámetro file se está pasando a la función writeToTemplate.

    En la función getTemplate, filePath.download() devuelve un buffer con el contenido del archivo, pero cuando se devuelve, no se guarda en una variable. En su lugar, el buffer se devuelve y se pasa como parámetro file a la función writeToTemplate.

    Para solucionar esto, puedes actualizar la función getTemplate para guardar el archivo descargado en una variable y devolver eso en su lugar:

    export const getTemplate = async (fileName: string) => {
      const filePath = admin
        .storage()
        .bucket()
        .file('sheets/template.xlsx')
    
      const [file] = await filePath.download()
      return file.toString('utf8') // convertir buffer a string y devolver
    }
    

    Luego, en la función writeToTemplate, cambia el nombre del parámetro de file a templateFile (para evitar confusión con la variable file devuelta de getTemplate). También puedes actualizar la función para analizar la cadena como un libro de Excel utilizando una biblioteca como xlsx:

    import * as XLSX from 'xlsx';
    
    export const writeToTemplate = (
      objects: any[],
      sheetNames: string[],
      templateFile: string
    ) => {
      const wb = XLSX.read(templateFile, { type: 'string' }); // analizar la cadena como un libro de Excel
    
      objects.forEach((dataObject, index) => {
        const sheetName = sheetNames[index]
        const worksheet = wb.Sheets[sheetName]
        XLSX.utils.sheet_add_json(worksheet, dataObject) // utilizar la biblioteca XLSX para modificar la hoja de cálculo
      })
    
      const buf = XLSX.write(wb, { type: 'buffer', bookType: 'xlsx' }); // convertir el libro de Excel de vuelta a buffer
      return buf;
    }
    

    Al convertir el buffer a una cadena y luego analizarlo como un libro de Excel, puedes modificar la hoja de cálculo según sea necesario antes de convertirla de vuelta a un buffer para guardarla en tu bucket de Firebase Storage.

Comments are closed.