The hosts dominated the early stages of the match and at one point had 92% of possession.
Their first chance almost broke the deadlock, but Alexandre Song's shot came back off the inside of the post.
Barca continued to dominate the ball, but Villarreal were holding firm at the back. Neymar tried to cut back inside on his right foot, only to find Mateo Musacchio in his way.
However, the opening goal came shortly after. Mario Gaspar was adjudged to have handled in the box and Neymar slotted the penalty into the bottom corner for 1-0.
© Getty Images
Musacchio grabbed an equaliser for the away side three minutes into the second half. Trigueros sent in a corner and the defender thumped in his header.
However, Neymar slotted in from close range with 68 minutes gone for his and Barca's second of the night.
The striker almost had his hat-trick a few minutes later, driving past two defenders before hitting a low shot which Asenjo had to tip away.