{{Macro
|Name=Macro_FCSpreadsheet_Extract
|Icon=Macro_FCSpreadsheet_Extract.png
|Description=This macro save the spreadsheet data in a csv file with the formula or in a xml file.
{{ColoredText|#ff0000|#ffffff|New version run only FC version 0.18 and more (PySide2 Qt5)}}
For the precedent version see [https://gist.githubusercontent.com/mario52a/29f7dce6934e8adf5d584bdddd2e469f/raw/ef0b0de56a65afc34a9a1a969969797910f3a004/Macro_FCSpreadSheet_Extract.FCMacro Macro_FCSpreadSheet_Extract.FCMacro] and install it manually.
|Author=Mario52
|Version=0.2
|Date=2020-03-14
|FCVersion=0.18 and more
|Download=[https://www.freecadweb.org/wiki/images/d/d5/Macro_FCSpreadsheet_Extract.png ToolBar Icon]
}}
This macro save the spreadsheet data in a csv file with the formula or in a xml file.
Run the macro
The icon for the tool bar to be placed in the same directory of the macro
Macro_FCSpreadSheet_Extract.FCMacro
{{MacroCode|code=
from future import unicode_literals """
- Copyright (c) 2018 2019 2020 *
-
*
- This file is a supplement to the FreeCAD CAx development system. *
-
*
- This program is free software; you can redistribute it and/or modify *
- it under the terms of the GNU Lesser General Public License (LGPL) *
- as published by the Free Software Foundation; either version 2 of *
- the License, or (at your option) any later version. *
- for detail see the LICENCE text file. *
-
*
- This software is distributed in the hope that it will be useful, *
- but WITHOUT ANY WARRANTY; without even the implied warranty of *
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- GNU Library General Public License for more details. *
-
*
- You should have received a copy of the GNU Library General Public *
- License along with this macro; if not, write to the Free Software *
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
- USA *
-
WARNING! All changes in this file will be lost and *
-
may cause malfunction of the program *
""" #05/05/2018 14/03/2020
title = "FCSpreadSheet_Extract" author = "Mario52" url = "https://www.freecadweb.org" Wiki = "https://wiki.freecadweb.org/Macro_FCSpreadSheet_Extract" version = "00.03" date = "2020/03/14" #YYYY/MM/DD
import WebGui #WebGui.openBrowser("http://www.freecadweb.org/") try: import PySide from PySide import QtGui import sys, os def errorDialog(msg): diag = QtGui.QMessageBox(QtGui.QMessageBox.Critical,u"Error FreeCAD Version",msg ) diag.setWindowFlags(PySide.QtCore.Qt.WindowStaysOnTopHint) # PySide #cette fonction met la fenetre en avant diag.setStyleSheet("QLabel {color : #ffffff; background-color : #FF3300; font: bold}") WebGui.openBrowser("https://gist.githubusercontent.com/mario52a/29f7dce6934e8adf5d584bdddd2e469f/raw/ef0b0de56a65afc34a9a1a969969797910f3a004/Macro_FCSpreadSheet_Extract.FCMacro" + "\n\n") diag.exec_() diag.setStyleSheet("Base")
if int(FreeCAD.Version()[1]) < 18: # Version of FreeCAD
memo = PySide.QtGui.QClipboard() # Copy the title in to the clipBoard
memo.setText(__title__)
FreeCAD.Console.PrintMessage("https://gist.githubusercontent.com/mario52a/29f7dce6934e8adf5d584bdddd2e469f/raw/ef0b0de56a65afc34a9a1a969969797910f3a004/Macro_FCSpreadSheet_Extract.FCMacro" + "\n\n")
errorDialog("This version " + __title__ + " works with FreeCAD v0.18 or higher. " + "\n\n"
"PySide2 Qt version: 5" + "\n\n"
"The macro it was derived from (30/04/2018 for FC v0.17) is displayed in your FreeCAD browser" + "\n\n"
"copy and paste it into the FCSpreadSheet_Extract macro or install it manually." + "\n\n"
"If the code is not displayed in the FreeCAD browser page," + "\n"
"copy the URL displayed in the Report View")
except Exception: None
import PySide2 from PySide2 import QtWidgets, QtGui ,QtCore from PySide2.QtGui import * from PySide2.QtCore import * import copy import re
path = FreeCAD.ConfigGet("UserAppData") #path = Your path
global ESCAPE global tableau global data
########## separator ESCAPE = "\t" #tabulation #compatible FC #ESCAPE = "," #virgule #compatible FCInfo #ESCAPE = ";" #point virgule #option #ESCAPE = " " #espace #option #ESCAPE = "" #vide #option ##########
def decodeColonne(colonne = "A"): # converti la chaine A ... ZZ en numero de colonne ex: A = 1; AA = 27 colonne = re.split('[0-9]+', colonne, flags=re.IGNORECASE)[0] # supp the alphanumeric number ex: A2 = A; A12 = A (1A return 0) try: if len(colonne) > 1: return ((ord(colonne[0].upper()) - 64) * 26 ) + (ord(colonne[1].upper()) - 64) # max 2 car (AAAA return 27) else: return (ord(colonne.upper()) - 64 ) except Exception: return 0
def decodeOccupation(dataTableau = ""): # decode the max occupation Colonnes, Lines and give the cell occupation # #lineMax, colonneMax, cellsOccupation = decodeOccupation(FreeCAD.ActiveDocument.getObject(str(Sheet.Name))) # try: #tyty = unicode(dataTableau.cells.Content, "utf-8") tyty = dataTableau.cells.Content tyty = tyty.split(">")
####
cellsOccupation = []
cellsSorted = [] # search the "A1" definition
for i in tyty[1:-2]: # split les cases dans la chaine XML
i = i[i.find('"')+1:]
i = i[:i.find('"')]
cellsOccupation.append(i)
cellsSorted = copy.deepcopy(cellsOccupation)
cellsSorted.sort()
####
linesMax = 0
for i in cellsSorted: # recherche le max (ligne et colonne)
colonnesMax = re.split('[0-9]+', i, flags=re.IGNORECASE) # colonne max (AA)
try:
dummy = int(re.split('[A-Z]+', i, flags=re.IGNORECASE)[1]) # line
if dummy > linesMax:
linesMax = dummy # lines max
except Exception:
None
del cellsSorted[:]
####
return linesMax, decodeColonne(colonnesMax[0]), cellsOccupation # return linesMax , colonnesMax, cellsOccupation
except Exception:
FreeCAD.Console.PrintError("Error data, Enter object <Sheet object> ex:" + "\n")
FreeCAD.Console.PrintError("lineMax, colonneMax, cellsOccupation = decodeOccupation(FreeCAD.ActiveDocument.getObject(str(Sheet.Name)))" + "\n")
return 0, 0, []
def caseTableau(ligne = 1, colonne = 1): # calcule et code la case du tableur ex: 1,1 = A1; 7,7 = G7 # # print caseTableau( 1, 1) # if ligne < 1: ligne = 1 if ligne > 16384: ligne = 16384 if colonne < 1: colonne = 1 if colonne > 702: colonne = 702 if (colonne > 26): if abs(colonne % 26) == 0: return chr(64 + (abs(colonne / 26) -1)) + chr(90) + str(ligne) else: return chr(64 + (abs(colonne / 26))) + chr(64 + (abs(colonne % 26))) + str(ligne) else: return chr(colonne + 64) + str(ligne)
def saveDataInFile(data = ""): global tableau
SaveName, Filter = PySide2.QtWidgets.QFileDialog.getSaveFileName(None, "Save a file txt", path, "CSV (*.csv);;XML (*.xml)") # PySide
if (SaveName == ""):
App.Console.PrintMessage("Process aborted"+"\n")
else:
App.Console.PrintMessage("Registration of "+SaveName+"\n")
try:
file = open(SaveName, 'w')
try:
if Filter == "XML (*.xml)":
ext = "(*.xml)"
file.write(tableau.cells.Content) # save XML
else:
ext = "(*.csv)"
for i in data:
file.write(i) # save CSV
print(i)
except Exception:
App.Console.PrintError("Error write file "+ext+"\n")
finally:
file.close()
except Exception:
App.Console.PrintError("Error Open file "+SaveName+"\n")
##tableau.getContents("A2") #lire une celulle ##print App.ActiveDocument.Spreadsheet.cells.Content #lire toutes les celulles # XML
try: for i in FreeCAD.ActiveDocument.Objects: # search SpreadSheet in all object obj = FreeCAD.ActiveDocument.getObject(i.Name).TypeId.split("::")[0] if obj == "Spreadsheet": tableau = FreeCAD.ActiveDocument.getObject(str(i.Name)) print( "Name : ",i.Name," ; Label : ",i.Label) break # quit to the first SpreadSheetlinesMax = decodeOccupation(tableau)[0] # linesMax colonnesMax = decodeOccupation(tableau)[1] # colonnesMax #print decodeOccupation(tableau)[2] # display the cells occupiedprint( "Number cell : ", linesMax * colonnesMax," (", linesMax," L x ", colonnesMax," C)") FreeCADGui.updateGui() # rafraichi l'ecrandataToSave = [] for i in range(1, linesMax+1): for ii in range(1, colonnesMax+1): # dataToSave.append(unicode(tableau.getContents(caseTableau(i,ii)), 'utf-8') + ESCAPE) dataToSave.append(tableau.getContents(caseTableau(i,ii)) + ESCAPE) dataToSave.append("\n")saveDataInFile(dataToSave) del dataToSave[:]print( "Fin FCSpreadSheet_Extract________\n") except Exception: print ("No SpreadSheet in the document or Error")
}}
documentation index > Macro FCSpreadSheet Extract