sestegra/spreadsheet_decoder

How to update the excel cell as Number instead of text.

Opened this issue · 5 comments

AnkuK commented

Hi ,

I am trying to save some values in the excel sheet as numbers that will later be used in Formulas. I am using SpreadsheetDecoder in Dart . The problem is , I am able to save the data , but the data saved is in Text format and so it being text i am not able to use in Formula that need Number. The code I am using is provided below.

import 'dart:io';
import 'dart:typed_data';
import 'package:path/path.dart';
import 'package:spreadsheet_decoder/spreadsheet_decoder.dart';

File file = File('FileToUpdate.xlsx');
List requiredRow;
SpreadsheetDecoder decoder;
Uint8List bytes;
/*
Row number (rowNum) for various values in excel sheet
'aValue':14 , int
'bValue':15 int
'cValue':16 double
*/
int rowNum = 14;
int newValue = 5;

void main(List args) {
bytes = file.readAsBytesSync();
decoder = SpreadsheetDecoder.decodeBytes(bytes, update: true);
final table = decoder.tables['SheetName'];
requiredRow = table.rows[rowNum];
var requiredValue = requiredRow[0] as String;
print(requiredValue);

setValue(newValue);

final valueStored = getValue();
print(valueStored);

}

void setValue(int value) {
decoder.updateCell('SheetToUpdate', 1, rowNum, value);
File(join('FileToUpdate.xlsx'))
..createSync(recursive: true)
..writeAsBytesSync(decoder.encode());
}

String getValue() {
String returnValue = requiredRow[1].toString();
return returnValue;
}

This feature isn't available yet.

The code that manages this is here.
https://github.com/sestegra/spreadsheet_decoder/blob/master/lib/src/xlsx.dart#L517

I won't have time to implement now.

@sestegra according to you is probably more related to https://github.com/sestegra/spreadsheet_decoder/blob/master/lib/src/xlsx.dart#L558 ;)
I am trying to implement the feature but I struggle to find the right structure excel demands.
Can you send me the source you used to look it up? I used https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet.celltype?view=openxml-2.8.1.
My solution atm is adding:

  static XmlElement _createCell(int columnIndex, int rowIndex, dynamic value) {
    final cellType = value.runtimeType == String ? 'InlineString' : 'n';
    
    var attributes = <XmlAttribute>[
      XmlAttribute(
          XmlName('r'), '${numericToLetters(columnIndex + 1)}${rowIndex + 1}'),          
      XmlAttribute(XmlName('t'), cellType),
    ];
    final bool hasValue = value == null;
    var children = hasValue
        ? <XmlElement>[]
        : _createChildrenForType(value);
    return XmlElement(XmlName('c'), attributes, children);
  }

  static Iterable<XmlNode> _createChildrenForType(dynamic value) {
    final Type valueType = value.runtimeType;
    if (valueType == String) {
        return [XmlElement(XmlName('is'), [], [
          XmlElement(XmlName('t'), [], [XmlText(value.toString())])
        ])];
    };

    return [XmlElement(XmlName('v'), [], [XmlText(value.toString())])];
  }

This produces an output like described in http://officeopenxml.com/SScontentOverview.php

            <c r="B2" t="InlineString">
                <is>
                    <t>MyString</t>
                </is>
            </c>
            <c r="C2" t="n">
                <v>1234567890.0</v>
            </c>

But excel can not handle it.
Any help would be appreciated.

Hey @sestegra could you throw me a 🦴 and send me into right direction. Unfortunately I am pretty stuck right now 😕
Thx

@AnkuK @sestegra @DerBasler

Facing same issue...
Any solutions?

Hey @MalikSamiAwan no unfortunately I had no time to dig in any further but let me know if you have more luck.