繁体   English   中英

如何将 WTForms form.data 导出为 XLSX

[英]How to export WTForms form.data as an XLSX

使用烧瓶很新我创建了一个前端表单,它将创建一个用于列表的 excel 文件。 在 Flask 上使用 Corey Schafers 教程作为模板。 我猜我需要将“post”.data 值作为字典解析为 openpyxl 或 pandas 之类的东西,但我完全不知道从哪里开始。 “条目”部分是感兴趣的部分。

感谢您花时间看这个。

前端表单示例在此处输入图像描述 形式:

   from flask_wtf import FlaskForm
    from flask_wtf.file import FileField, FileAllowed
    from flask_login import current_user
    from wtforms import StringField, PasswordField, SubmitField, BooleanField, DateTimeField, RadioField, SelectField, \
        IntegerField, SelectMultipleField, DateField, validators
    from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
    from flaskblog.models import User,Entry
    from datetime import datetime
    from wtforms import widgets
    
    
    class RegistrationForm(FlaskForm):
        username = StringField('Username',
                               validators=[DataRequired(), Length(min=2, max=20)])
        email = StringField('Email',
                            validators=[DataRequired(), Email()])
        password = PasswordField('Password', validators=[DataRequired()])
        confirm_password = PasswordField('Confirm Password',
                                         validators=[DataRequired(), EqualTo('password')])
        submit = SubmitField('Sign Up')
    
        def validate_username(self, username):
            user = User.query.filter_by(username=username.data).first()
            if user:
                raise ValidationError('That username is taken. Please choose a different one.')
    
        def validate_email(self, email):
            user = User.query.filter_by(email=email.data).first()
            if user:
                raise ValidationError('That email is taken. Please choose a different one.')
    
    
    class LoginForm(FlaskForm):
        email = StringField('Email',
                            validators=[DataRequired(), Email()])
        password = PasswordField('Password', validators=[DataRequired()])
        remember = BooleanField('Remember Me')
        submit = SubmitField('Login')
    
    
    class UpdateAccountForm(FlaskForm):
        username = StringField('Username',
                               validators=[DataRequired(), Length(min=2, max=20)])
        email = StringField('Email',
                            validators=[DataRequired(), Email()])
        picture = FileField('Update Profile Picture', validators=[FileAllowed(['jpg', 'png'])])
        submit = SubmitField('Update')
    
        def validate_username(self, username):
            if username.data != current_user.username:
                user = User.query.filter_by(username=username.data).first()
                if user:
                    raise ValidationError('That username is taken. Please choose a different one.')
    
        def validate_email(self, email):
            if email.data != current_user.email:
                user = User.query.filter_by(email=email.data).first()
                if user:
                    raise ValidationError('That email is taken. Please choose a different one.')
    
    
    class MultiCheckboxField(SelectMultipleField):
        widget = widgets.ListWidget(prefix_label=False)
        option_widget = widgets.CheckboxInput()
    
    
    date = datetime.now()
    
    
    # Entry form content
    class Entry(FlaskForm):
        User = current_user
        Date = date.strftime("%a"' ' "%b" ' ' '%d' ' ' '%Y')
        Time = date.strftime("%R")
        SKU = StringField("SKU", validators=[DataRequired()])
        Parent = BooleanField('Is this a parent SKU?', default='checked')
        Brand = SelectField("Enter Brand", choices=['addidas', 'Rebok'], validators=[DataRequired()])
        Gender = SelectField("Select Gender", choices=['', 'Female', 'Male', 'Kids'])
        Closure = SelectField("Select Closure Type", choices=['', 'test'], validators=[DataRequired()])
        Model = StringField("Select Model", validators=[DataRequired()])
        Type = SelectField("Select Type", choices=['', 'test'], validators=[DataRequired()])
        Colour = SelectField("Select main colour", choices=['', 'test'], validators=[DataRequired()])
        Country_Manu = SelectField("Select the country of manufacture", choices=['', 'test'], validators=[DataRequired()])
        Upper_Mat = SelectField("Select the upper material", choices=['', 'Leather'], validators=[DataRequired()])
        Lining_Mat = SelectField("Select the lining material", choices=['', 'test'], validators=[DataRequired()])
        Insole_Mat = SelectField("Select the insole material", choices=['', 'test'], validators=[DataRequired()])
        Heel_Height = IntegerField("Input the heel height in cm", validators=[DataRequired()])
        Weight = IntegerField("Input the weight in KG", validators=[DataRequired()])
        Height = IntegerField("Input the products height in cm", validators=[DataRequired()])
        Length = IntegerField("Input the products length in cm", validators=[DataRequired()])
        Depth = IntegerField("Input the products depth in cm", validators=[DataRequired()])
        Purchase_Ord = StringField("Input the purchase order number", validators=[DataRequired()])
        Label = SelectField("Select the label", choices=['', 'test'], validators=[DataRequired()])
        Kids_Sizes = MultiCheckboxField("Please Select size", choices=['2', '3', '4', '5', '6'])
        Adult_Sizes = MultiCheckboxField("Please Select size", choices=['2', '3'])
        submit = SubmitField('Submit')

楷模:

from datetime import datetime
from flaskblog import db, login_manager
from flask_login import UserMixin
import pandas as pd


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

    def __repr__(self):
        return f"User('{self.username}', '{self.email}', '{self.image_file}')"


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)


# Data entry form to be submitted to database
class Entry(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    Date = db.Column(db.DateTime, default=datetime.utcnow)
    SKU = db.Column(db.Integer, unique=True, nullable=False)
    Parent = db.Column(db.Boolean)
    Brand = db.Column(db.String(20), unique=True, nullable=False)
    Gender = db.Column(db.String(20), unique=True, nullable=False)
    Closure = db.Column(db.String(20), unique=True, nullable=False)
    Type = db.Column(db.String(20), unique=True, nullable=False)
    Colour = db.Column(db.String(20), unique=True, nullable=False)
    Country_Manu = db.Column(db.String(20), unique=True, nullable=False)
    Upper_Mat = db.Column(db.String(20), unique=True, nullable=False)
    Lining_Mat = db.Column(db.String(20), unique=True, nullable=False)
    Insole_Mat = db.Column(db.String(20), unique=True, nullable=False)
    Heel_Height = db.Column(db.Integer, unique=True, nullable=False)
    Weight = db.Column(db.Integer, unique=True, nullable=False)
    Height = db.Column(db.Integer, unique=True, nullable=False)
    Length = db.Column(db.Integer, unique=True, nullable=False)
    Depth = db.Column(db.Integer, unique=True, nullable=False)
    Purchase_Ord = db.Column(db.Integer, unique=True, nullable=False)
    Label = db.Column(db.String(20), unique=True, nullable=False)
    Kids_Sizes = db.Column(db.Integer, unique=True, nullable=False)
    Adult_Sizes = db.Column(db.Integer, unique=True, nullable=False)

    def __repr__(self):
        return f"Post('{self.title}', '{self.date_posted}')"

路线:

import os
import secrets
from PIL import Image
from flask import render_template, url_for, flash, redirect, request
from flaskblog import app, db, bcrypt
from flaskblog.forms import RegistrationForm, LoginForm, UpdateAccountForm, Entry
from flaskblog.models import User, Post
from flask_login import login_user, current_user, logout_user, login_required
#from forms import Entry

posts = [
    {
        'author': 'Corey Schafer',
        'title': 'Blog Post 1',
        'content': 'First post content',
        'date_posted': 'April 20, 2018'
    },
    {
        'author': 'Jane Doe',
        'title': 'Blog Post 2',
        'content': 'Second post content',
        'date_posted': 'April 21, 2018'
    }
]


@app.route("/")
@app.route("/home")
def home():
    return render_template('home.html', posts=posts)


@app.route("/about")
def about():
    return render_template('about.html', title='About')


@app.route("/register", methods=['GET', 'POST'])
def register():
    if current_user.is_authenticated:
        return redirect(url_for('home'))
    form = RegistrationForm()
    if form.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
        user = User(username=form.username.data, email=form.email.data, password=hashed_password)
        db.session.add(user)
        db.session.commit()
        flash('Your account has been created! You are now able to log in', 'success')
        return redirect(url_for('login'))
    return render_template('register.html', title='Register', form=form)


@app.route("/login", methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('home'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user and bcrypt.check_password_hash(user.password, form.password.data):
            login_user(user, remember=form.remember.data)
            next_page = request.args.get('next')
            return redirect(next_page) if next_page else redirect(url_for('home'))
        else:
            flash('Login Unsuccessful. Please check email and password', 'danger')
    return render_template('login.html', title='Login', form=form)


@app.route("/logout")
def logout():
    logout_user()
    return redirect(url_for('home'))


def save_picture(form_picture):
    random_hex = secrets.token_hex(8)
    _, f_ext = os.path.splitext(form_picture.filename)
    picture_fn = random_hex + f_ext
    picture_path = os.path.join(app.root_path, 'static/profile_pics', picture_fn)

    output_size = (125, 125)
    i = Image.open(form_picture)
    i.thumbnail(output_size)
    i.save(picture_path)

    return picture_fn


@app.route("/account", methods=['GET', 'POST'])
@login_required
def account():
    form = UpdateAccountForm()
    if form.validate_on_submit():
        if form.picture.data:
            picture_file = save_picture(form.picture.data)
            current_user.image_file = picture_file
        current_user.username = form.username.data
        current_user.email = form.email.data
        db.session.commit()
        flash('Your account has been updated!', 'success')
        return redirect(url_for('account'))
    elif request.method == 'GET':
        form.username.data = current_user.username
        form.email.data = current_user.email
    image_file = url_for('static', filename='profile_pics/' + current_user.image_file)
    return render_template('account.html', title='Account',
                           image_file=image_file, form=form)


@app.errorhandler(404)
def page_not_found(e):
    return render_template("404.html"), 404


# internal server error
@app.errorhandler(500)
def page_not_found(e):
    return render_template("500.html"), 500


# Entry form
@app.route('/entry', methods=['GET', 'POST'])
@login_required
def entry():
    form = Entry()

    if form.validate_on_submit():
        post = Post(SKU=form.SKU.data,
                    Parent=form.Parent.data,
                    Brand=form.Brand.data,
                    Gender=form.Gender.data,
                    Closure=form.Closure.data,
                    Model=form.Model.data,
                    Type=form.Type.data,
                    Colour=form.Colour.data,
                    Country_Manu=form.Country_Manu.data,
                    Upper_Mat=form.Upper_Mat.data,
                    Lining_Mat=form.Lining_Mat.data,
                    Insole_Mat=form.Insole_Mat.data,
                    Heel_Height=form.Heel_Height.data,
                    Weight=form.Weight.data,
                    Height=form.Height.data,
                    Length=form.Length.data,
                    Depth=form.Depth.data,
                    Purchased_Ord=form.Purchase_Ord.data,
                    Label=form.Label.data,
                    Kids_Sizes=form.Kids_Sizes.data,
                    Adult_Sizes=form.Adult_Sizes.data,)

        db.session.add(post)
        db.session.commit()
        flash('Your post has been created!', 'success')
        return redirect(url_for('entry'))
    return render_template('entry.html', title='Entry',
                           form=form, legend='Entry')

使用熊猫修复

if form.submit():

    # write form data to an excel file

    df = pd.DataFrame(form.data, index=[0])
    # print dataframe
    print(df)
    print(SKU)





    df.to_excel(xlsx, sheet_name=current_user.username + '_' + str(datetime.date.today()),columns=form.data, index=form.data , startrow=len(df))

    df = pd.read_excel(xlsx)
    df.to_csv(csv,index=False)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM